Подразумевает ли вызов pthread_cond_signal или pthread_cond_broadcast барьер записи в память?C++

Программы на C++. Форум разработчиков
Ответить
Гость
 Подразумевает ли вызов pthread_cond_signal или pthread_cond_broadcast барьер записи в память?

Сообщение Гость »

Переменные состояния обычно используются таким образом, что состояние, на которое они ссылаются, изменяется под действием мьютекса. Однако, когда состояние представляет собой всего лишь один флаг, предназначенный только для установки, нет необходимости во мьютексе для предотвращения одновременного выполнения. Итак, можно сделать что-то вроде этого:

Код: Выделить всё

flag = 1;
pthread_cond_broadcast(&cvar);
Однако это безопасно только в том случае, если pthread_cond_broadcast подразумевает барьер записи в память; в противном случае ожидающий поток может увидеть широковещательную переменную условия до записи флага. То есть ожидающий поток может проснуться, использовать сигнал cvar, но увидеть флаг по-прежнему равным 0.

Итак, мой вопрос: выполните pthread_cond_broadcast< Вызовы /code> и pthread_cond_signal подразумевают барьер записи в память? Если да, то где это указано в соответствующих спецификациях POSIX (или других)? В спецификации этот момент показался неясным.

Примечание. Я знаю, что на практике это приводит к барьеру памяти (в Linux, поскольку пробуждение потока подразумевает полную Барьер памяти ЦП, а вызов межбиблиотечной функции подразумевает барьер памяти компилятора). Однако меня интересует, что гарантирует спецификация.

Подробнее здесь: https://stackoverflow.com/questions/723 ... e-memory-b
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»