线程间通信的Volatile和互斥

volatile and mutex for inter thread communication

本文关键字:Volatile 通信 线程      更新时间:2023-10-16

我有以下类

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到寄存器并在寄存器上旋转)被阻止?

Volatile在这里不起作用,因为有两个问题:

  1. 编译器优化读/写(可以由编译器管理,部分)
  2. 内部CPU指令重排序(不能被编译器管理)
因此,您必须至少用内存屏障标记共享变量,以防止重新排序。互斥锁将适合这里(不是最好的性能,但它将工作)。此外,您可以尝试任何可用的读写锁,因为它应该100%符合您的语义。