我对并发很新,我在决定如何使用互斥锁时遇到了麻烦.目前,它们遍布我的代码,两个线程相互作用.这种互斥体的使用是否合适?
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)
我有很多数据成员可以通过不同的线程从外部读取和设置,我发现跟踪所有获取和释放互斥锁是一件令人头痛的问题.
原始类型的突变不保证是线程安全的,或者更具体地说是原子的。事实上,如果您仔细查看,<atomic>您会发现有几个专业,包括std::atomic_int.
原子类型的对象是唯一不受数据竞争影响的 C++ 对象;也就是说,如果一个线程写入一个原子对象,而另一个线程从中读取,则该行为是明确定义的。
为了具体回答有关互斥体使用的问题,是的,您在示例中使用互斥体很好。一般来说,您希望保持互斥体的时间尽可能短。换句话说,如果您有一个执行大量工作的函数,则仅锁定非线程安全代码周围的互斥锁,然后在代码线程安全后立即将其解锁。