2017-03-29 13 views
2

[이하, C++ 용어]

I는 정수 값 P. 쓰레드 (A)에 대한 액세스를 공유하는 B 스레드 A 및 스레드가이 값을 실행하는 동안 업데이트 초기화있다. 그런 다음 스레드 A가 완료됩니다. 스레드 B는 스레드 A가 완료 될 때까지 기다리고 (OS가 사용되는 모든 표준 OS API 호출) 대기하고 있습니다.

스레드 A는 스레드 A가 마지막으로 설정 한 일관성있는 읽기 위해 메모리 장벽을 필요로합니까? 피? OS API가 "thread A finished"라고했을 때 수정 한 메모리의 변경 사항이 다른 스레드에 아직 표시되지 않을 가능성이 있습니까?

참고가 전에 요청 "Is there an implicit memory barrier with synchronized-with relationship on thread::join?"에서이 질문을 구분하지 않을 수 있습니다 또는 여기에 값을 쓰는 단 하나의 스레드. 내 직감은 대답이 동일해야한다고 말하지만 ...완료된 스레드에 의해 수정 된 메모리에 액세스하기 위해 메모리 장벽이 필요합니까?

+1

이것은'std :: future '와 같은 것 같습니다. –

+0

[this] (https://timsong-cpp.github.io/cppwp/thread.thread.member#4)의 글에서, 예 - .join()은 동기화가 필요하다고 말하고 싶습니다. 기억 장벽. 그러나이 본문은 평범한 필사자가 해석 할 수 있도록 쓰여진 것이 아니므로 나는 다른 사람에게 응답을 남겨 둘 것입니다. 아마 http://stackoverflow.com/questions/12444891/are-memory-barriers-required-when-joining-on-a-thread?rq=1의 사본도 있습니다. – nos

답변

1

joinjoin을 호출하는 스레드와 동기화됩니다. 즉, A이 작성하는 모든 쓰기는 BA.join() 일 때 B에 표시됩니다.

당신은 Astd::atomic_thread_fence(std::memory_order_acquire 조인 실행이 완료로 std::atomic_thread_fence(memory_order_release)을 실행 AB로 생각할 수 있습니다.

스레드 B는 메모리 장벽

예를 필요로 하는가, 그러나 그들은 join에서 암시하고 당신이 그들을 작성할 필요가 없습니다.

OS API에 "스레드 A 완료"라고 표시되면 수정 된 메모리 변경 내용이 다른 스레드에 아직 표시되지 않을 수 있습니까?

join의 호출자 이외의 스레드는 추가 동기화가 필요합니다. std::condition_variable 또는 std::atomic_thread_fence(std::memory_order_acquire);