Mutex用于简单数据类型

Q-b*_*uit 5 c++ mutex

我对并发很新,我在决定如何使用互斥锁时遇到了麻烦.目前,它们遍布我的代码,两个线程相互作用.这种互斥体的使用是否合适?

class Foo
{
public:
    void SetMember(int n) {  AcquireMutex(..); n_ = n; ReleaseMutex(...);}
private:
   Thread()
   {
      while(1)
      {
         AcquireMutex(..);
         // Do something with n_
         ReleaseMutex(...);
       }
   }
};
Run Code Online (Sandbox Code Playgroud)

我有很多数据成员可以通过不同的线程从外部读取和设置,我发现跟踪所有获取和释放互斥锁是一件令人头痛的问题.

Cor*_*mer 3

原始类型的突变不保证是线程安全的,或者更具体地说是原子的。事实上,如果您仔细查看,<atomic>您会发现有几个专业,包括std::atomic_int.

来自cpreference

原子类型的对象是唯一不受数据竞争影响的 C++ 对象;也就是说,如果一个线程写入一个原子对象,而另一个线程从中读取,则该行为是明确定义的。

为了具体回答有关互斥体使用的问题,是的,您在示例中使用互斥体很好。一般来说,您希望保持互斥体的时间尽可能短。换句话说,如果您有一个执行大量工作的函数,则仅锁定非线程安全代码周围的互斥锁,然后在代码线程安全后立即将其解锁。