用于线程间通信的volatile和mutex

时间:2015-08-03 11:51:02

标签: c++ multithreading concurrency volatile condition-variable

我有以下课程

class Thread
{
   int m_state;
   Mutex m;
   CondVar v;

   Thread(): m_state( 0 ) {}

   write()
   {
     // Get mutex m
     // m_state = 1;
     // signal v
   };

   read()
   {
      // Get mutex m
      while( m_state == 0 )
      {
         wait v;
      };
   };
};

read()和write()可以在不同的线程上调用。

在这种情况下,我们是否必须生成m_state或volatile,或者编译器确保阻止优化(例如从内存读取m_state以注册和在寄存器上旋转)?

1 个答案:

答案 0 :(得分:0)

Volatile在这里没有帮助,因为有两个问题:

  1. 编译器优化读/写(可由编译器管理,部分
  2. 内部CPU指令重新排序(无法通过编译器管理
  3. 因此,您必须至少使用内存屏障标记共享变量,以防止重新排序。 Mutex适合这里(不是最好的表现,但它会起作用)。此外,您可以尝试任何可用的读写器锁,因为它应该适合您的语义100%。