Переменные условия обычно используются таким образом, что состояние, к которому они относятся, изменяется под мьютексом.Тем не менее, когда состояние представляет собой один единственный установленный флаг, нет необходимости в мьютексе для предотвращения одновременного выполнения.Поэтому можно захотеть сделать что-то вроде этого:
flag = 1;
pthread_cond_broadcast(&cvar);
Однако это безопасно, только если pthread_cond_broadcast
подразумевает барьер памяти для записи;в противном случае ожидающий поток может увидеть переменную условия, переданную перед записью флага.То есть ожидающий поток может пробудиться, принять сигнал cvar, но увидеть флаг все еще 0
.
Итак, мой вопрос: означают ли вызовы pthread_cond_broadcast
и pthread_cond_signal
барьер для записи памяти?Если да, где это указано в соответствующих спецификациях POSIX (или других)? Спецификация казалась неясной в этом вопросе.
Примечание: я знаю, что на практике это приводит к барьеру памяти (в Linux, поскольку пробуждение потока подразумевает полный барьер памяти процессора)и кросс-библиотечный вызов функции подразумевает барьер памяти компилятора).Тем не менее, меня интересует, какие технические гарантии.