일부 작업을 수행하는 여러 스레드를 시작하는 코드가 있습니다. 실패한 경우 공유 변수를 false으로 설정합니다.thread :: join에서 synchronized-with relationship이있는 암시 적 메모리 장벽이 있습니까?
그러면 주 스레드가 모든 작업 스레드를 조인합니다.
#include <thread>
#include <atomic>
#include <vector>
#include <iostream>
#include <cassert>
using namespace std;
//atomic_bool success = true;
bool success = true;
int main()
{
vector<thread> v;
for (int i = 0; i < 10; ++i)
{
v.emplace_back([=]
{
if (i == 5 || i == 6)
{
//success.store(false, memory_order_release);
success = false;
}
});
}
for (auto& t : v)
t.join();
//assert(success.load(memory_order_acquire) == false);
assert(success == false);
cout << "Finished" << endl;
cin.get();
return 0;
}
메인 스레드가 비록 사실로 성공 변수를 읽을 가능성이 있습니다 :이 시뮬레이션은 대략 이렇게 (내가 필요할 경우 나도 몰라하는 가능한 수정에서 주석) 보이는 근로자 중 한 명이 거짓으로 설정했습니다?
나는 스레드가 :: 가입() 전체 메모리 장벽 ( source)하지만 그, 동기화-와 관계 성공 메인 스레드에서 변수를 읽을 다음과 의미 않는 것을 발견 그래서 우리 최신 가치를 보장 받습니까?이 경우에는 (주석이 달린 코드에 게시 된) 수정본이 필요합니까 (아니면이 수정본이 잘못되었을 때 다른 수정이 필요합니까?)?
(이 휘발성하지 이후) 변수가 멀리 최적화 될 것이며 우리가 스레드 :: 가입에 암시 적 메모리 장벽을 존재하는 suppossed에 관계없이 의 이전 값을 얻을 것이다 성공 읽을 가능성이 있습니까?
이 코드는 여러 아키텍처에서 작동하도록 선전되었지만 (모두 기억할 수는 없으며, 내 앞에 메이크 파일이 없음) 적어도 x86, amd64, itanium, arm7이 있습니다.
감사합니다.
편집 : 실제 상황에서 더 많은 스레드가 성공 변수에 쓸 수 있기 때문에 예제를 수정했습니다.
출처가 명확하지 않습니까? "스레드 생성 및 구조는 동기화 작업으로 정의되므로 스레드 결합은 필연적으로 해당 스레드가 종료 된 후에 발생하므로 스레드가 종료되기 전에 반드시 발생하는 모든 사항을 볼 수 있습니다." –
http : //en.cppreference에서 볼 수 있듯이 이후 확실하지 않습니다.co.kr/w/cpp/atomic/atomic_thread_fence 참조는 울타리와 원자 물체 간의 동기화만을 언급하며 펜스와 일반 객체 간의 동기화에 대해서는 아무 것도 없습니다. 내 생각에 조인은 그런 울타리를 내부적으로 사용한다고 생각하지만 틀릴 수도 있습니다. – Mikaka
[예] (https://timsong-cpp.github.io/cppwp/thread.thread.member#4). 그렇지 않으면'join'은 오히려 쓸모가 없다. –