通常使用条件变量,以便在互斥锁下修改它们所指的状态。但是,当状态只是一个仅设置标志时,不需要互斥锁来防止同时执行。所以一个人可能想做这样的事情:
flag = 1;
pthread_cond_broadcast(&cvar);
但是,这只有在pthread_cond_broadcast
意味着写入内存屏障时才是安全的;否则,等待线程可能会在标志写入之前看到条件变量广播。也就是说,等待线程可能会唤醒,消耗 cvar 信号,但仍然看到标志0
。
所以,我的问题是:pthread_cond_broadcast
andpthread_cond_signal
调用是否意味着写内存屏障?如果是这样,这在相关的 POSIX(或其他)规范中在哪里指定?规范在这一点上似乎不清楚。
注意:我知道,在实践中,这确实会导致内存屏障(在 Linux 上,因为线程唤醒意味着完整的 CPU 内存屏障,而跨库函数调用意味着编译器内存屏障)。但是,我对规范保证的内容感兴趣。