[이하, 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?"에서이 질문을 구분하지 않을 수 있습니다 또는 여기에 값을 쓰는 단 하나의 스레드. 내 직감은 대답이 동일해야한다고 말하지만 ...완료된 스레드에 의해 수정 된 메모리에 액세스하기 위해 메모리 장벽이 필요합니까?
2
A
답변
1
join
은 join
을 호출하는 스레드와 동기화됩니다. 즉, A
이 작성하는 모든 쓰기는 B
이 A.join()
일 때 B
에 표시됩니다.
당신은 A
로 std::atomic_thread_fence(std::memory_order_acquire
조인 실행이 완료로 std::atomic_thread_fence(memory_order_release)
을 실행 A
및 B
로 생각할 수 있습니다.
스레드 B는 메모리 장벽
예를 필요로 하는가, 그러나 그들은 join
에서 암시하고 당신이 그들을 작성할 필요가 없습니다.
OS API에 "스레드 A 완료"라고 표시되면 수정 된 메모리 변경 내용이 다른 스레드에 아직 표시되지 않을 수 있습니까?
join
의 호출자 이외의 스레드는 추가 동기화가 필요합니다. std::condition_variable
또는 std::atomic_thread_fence(std::memory_order_acquire);
이것은'std :: future '와 같은 것 같습니다. –
[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