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