简单数据类型的互斥锁
Mutex for simple data types
我对并发性很陌生,我在决定如何使用互斥锁时遇到了麻烦。目前,它们散布在两个线程交互的代码中。这样使用互斥锁是合适的吗?
class Foo
{
public:
void SetMember(int n) { AcquireMutex(..); n_ = n; ReleaseMutex(...);}
private:
Thread()
{
while(1)
{
AcquireMutex(..);
// Do something with n_
ReleaseMutex(...);
}
}
};
我有相当多的数据成员可以由不同的线程从外部读取和设置,我发现跟踪所有获取和释放互斥锁是一件令人头痛的事情。
基本类型的突变不能保证是线程安全的,或者更确切地说是原子性的。事实上,如果您查看<atomic>
,您会注意到有几个专门化,包括std::atomic_int
。
原子类型的对象是c++中唯一没有数据竞争的对象;也就是说,如果一个线程写一个原子对象,而另一个线程从它读,行为是良好定义的。
具体回答你关于使用互斥锁的问题,是的,你在你的例子中使用互斥锁是好的。一般来说,您希望保持互斥锁的时间越短越好。换句话说,如果你有一个做很多工作的函数,只锁定非线程安全代码周围的互斥锁,然后在代码是线程安全的时候解锁它。
这种互斥方法非常幼稚,它无法避免死锁和其他并发性问题。
您必须明确地标识代码中两个进程同时访问会导致问题的地方,并将它们保护在临界区。你必须确保你不会让两个进程开始一个操作,因为另一个进程无法完成。
在其他地方,可能不需要保护,激活互斥锁是多余的。
通常,原子性不是单个变量所需要的,而是一组耦合变量所需要的
相关文章:
- 防止主数据类型C++的隐式转换
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在C++中打印指向不同基元数据类型的指针的内存地址
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何计算数据类型的范围,例如int
- C++中数据类型修饰符的顺序
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 特定数据类型的模板类
- 具有多个模板的模板函数,用于特定数据类型(如字符串)?
- 有没有办法提示用户使用哪种数据类型作为模板 c++
- OpenSSL模块化最大数据类型大小的简单方法
- 模板类型在简单的数据类型中扣除
- 尝试在64位数据类型上运行简单模板内核时,cudaErrorLaunchFailure
- 简单抽象数据类型链表
- 模板函数的简单脚本引擎模板数据类型
- 简单数据类型的互斥锁
- 有没有一种简单有效的方法可以在达到数据类型限制后动态更改数据类型?
- boost是否有比STL更简单的用于集合操作的数据类型?
- C++11 在map<key,value>中存储值(整数和字符串)的多种数据类型的最简单方法?
- 提振.图-有2个简单类和一个类-数据类型如何创建一个图