C ++ 11 читает bool одновременно - PullRequest
0 голосов
/ 12 июня 2018

Когда у меня есть std::condition_variable cond и немного bool flag, я могу ждать его, используя предикат:

cond.wait_for(some_lock, std::chrono::milliseconds(100), { return flag; })

Теперь мне интересно: технически C ++ имеет только правильную модель многопоточной памяти в C++ 11, и доступ к переменной flag в многопоточном контексте в основном не определен.Поэтому я должен объявить это std::atomic<bool>, чтобы избежать этого неопределенного поведения, верно?

Мне особенно интересно: если я НЕ объявляю это std::atomic, может ли это быть, что я читаю устаревшие значения из flag все время, так как обновление никогда не попадает в основную память?Или это случай "теоретически да, но практически никогда не бывает"?

1 Ответ

0 голосов
/ 12 июня 2018

Технически C ++ получил только правильную модель многопоточной памяти в C ++ 11, и доступ к переменной flag в многопоточном контексте в основном не определен.

Доступ к переменной с общим потоком в C ++ четко определен, если нет гонок данных.См. Потоки и гонки данных для более подробной информации:

... в частности, выпуск std::mutex синхронизирован с с , и, следовательно, происходит до получения того же мьютекса другим потоком, что позволяет использовать блокировки мьютекса для защиты от гонок данных.


Блокировка / разблокировка мьютекса составляют приобретение/ освободить барьеры памяти.Вам не нужно std::atomic для общего состояния потока, доступ к которому возможен только при заблокированном мьютексе.Когда уведомление об условии получено, оно сначала блокирует мьютекс, чтобы вы могли безопасно получить доступ к общему состоянию.


Люди часто представляют гонки данных, когда пытаются использовать std::atomic переменные с std::mutex/std::condition_variable идоступ к этому std::atomic без удержания мьютекса. Пример .

...