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