我对并发还很陌生,并且在决定如何使用互斥体时遇到困难。目前,它们散布在我的代码中两个线程交互的地方。这种互斥体的使用是否合适?
class Foo
{
public:
void SetMember(int n) { AcquireMutex(..); n_ = n; ReleaseMutex(...);}
private:
Thread()
{
while(1)
{
AcquireMutex(..);
// Do something with n_
ReleaseMutex(...);
}
}
};
我有很多数据成员可以通过不同的线程从外部读取和设置,并且我发现跟踪所有互斥体的获取和释放是一件令人头痛的事情。
原始类型的突变不保证是线程安全的,或者更具体地说是原子的。事实上,如果你看看<atomic> http://en.cppreference.com/w/cpp/atomic/atomic您会注意到有几个专业,包括std::atomic_int
.
From 参考参数 http://en.cppreference.com/w/cpp/atomic/atomic
原子类型的对象是唯一不受数据竞争影响的 C++ 对象;也就是说,如果一个线程写入一个原子对象,而另一个线程从中读取,则该行为是明确定义的。
为了具体回答有关互斥体使用的问题,是的,您在示例中使用互斥体很好。一般来说,您希望保持互斥体的时间尽可能短。换句话说,如果您有一个需要执行大量工作的函数,则只需锁定非线程安全代码周围的互斥锁,然后在代码线程安全后立即将其解锁。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)