Yve*_*ves 4 multithreading mutex thread-safety c++11 stdatomic
在上面的问题中,显然我们可以std::mutex用来保持线程安全.我想知道何时使用哪一个.
classs A
{
std::atomic<int> x;
public:
A()
{
x=0;
}
void Add()
{
x++;
}
void Sub()
{
x--;
}
};
Run Code Online (Sandbox Code Playgroud)
和
std::mutex mtx;
classs A
{
int x;
public:
A()
{
x=0;
}
void Add()
{
std::lock_guard<std::mutex> guard(mtx);
x++;
}
void Sub()
{
std::lock_guard<std::mutex> guard(mtx);
x--;
}
};
Run Code Online (Sandbox Code Playgroud)
根据经验,std::atomic用于POD类型,其中底层专业化将能够使用巧妙的东西,如CPU上的总线锁(这将不会给您带来管道转储的开销),甚至是自旋锁.在某些系统上,int可能已经是原子的,因此std::atomic<int>将有效地专门化为int.
使用std::mutex用于非POD类型,铭记获取互斥是至少比一个总线锁定慢一个数量级.
如果您仍然不确定,请测量性能.
| 归档时间: |
|
| 查看次数: |
1089 次 |
| 最近记录: |