Cae*_*uer 10 c++ multithreading pthreads
我最近在C++多线程代码中遇到了volatile关键字的奇怪用法.为了抽象编程模式,我们假设有一个控制对象可以被一个生产者和几个消费者线程访问:
class control_t {
pthread_mutex_t control_lock;
pthread_cond_t wake_cond;
bool there_is_work_todo;
control_t volatile* vthis() { return this; }
}
Run Code Online (Sandbox Code Playgroud)
消费者线程执行以下操作(c是指向控件对象的非易失性指针):
...
pthread_mutex_lock(c->control_lock)
while (!c->vthis()->there_is_work_todo) {
pthread_cond_wait(&c->wake_cond, &c->control_lock);
}
...
Run Code Online (Sandbox Code Playgroud)
这里的想法是消费者线程将等待,直到有一些工作要做,生产者通过wake_cond变量发出信号.
我在这里不明白的是为什么控制对象是通过指向"this"的易失性指针访问的,该指针由方法vthis()返回.这是为什么?
采用volatile多线程代码通常是怀疑.volatile旨在避免优化读取和写入内存,这在映射到硬件寄存器的特殊地址上发生此类读取和写入时非常有用.例如,请参阅如何volatile防止数据争用,以及如何(ab)将其用作幻像类型......
由于作者使用了正确的同步(互斥和条件变量),因此使用of volatile是非常可疑的.这种用法通常源于误解,最明显的是通过诸如Java之类的语言传播,这些语言重用了具有不同语义的相同关键字.
在C和C++中,多线程代码应该依赖于内存障碍,例如互斥锁和原子操作引入的内存障碍,这些障碍保证了值在不同的CPU内核和高速缓存之间正确同步.
| 归档时间: |
|
| 查看次数: |
288 次 |
| 最近记录: |