Рассмотрим следующую программу:
int i{0};
std::experimental::barrier b{2};
int main()
{
std::thread t0{[] {
b.arrive_and_wait();
std::cout << i << '\n';
}};
std::thread t1{[] {
i = 2;
b.arrive_and_wait();
}};
t0.join();
t1.join();
}
Гарантируется ли в этой программе вывод 2
, даже если i
не является атомарной переменной?
Согласно cppreference :
Вызов arrive_and_wait
синхронизируется с началом фазы завершения барьера.Завершение фазы завершения синхронизируется с возвратом из вызова.
Вызовы arrive_and_drop
и arrive_and_wait
никогда не вводят гонки данных между собой или друг с другом.
Это предполагаетчто на каждом arrive_and_wait
вызове есть точка синхронизации.Однако я не уверен, разрешено ли компилятору переупорядочивать операции чтения / записи для i
, поскольку он не является атомарным.