std::atomic和std::mutex的区别
The difference btween std::atomic and std::mutex
how to use std::atomic<>
在上面的问题中,显然我们可以只使用std::mutex
来保持线程安全。我想知道什么时候用哪个。
classs A
{
std::atomic<int> x;
public:
A()
{
x=0;
}
void Add()
{
x++;
}
void Sub()
{
x--;
}
};
和
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--;
}
};
根据经验,对 POD 类型使用 std::atomic
,其中底层特化将能够使用一些聪明的东西,比如 CPU 上的总线锁(这不会给你更多的开销比管道转储),甚至是自旋锁。在某些系统上,int
可能 已经 是原子的,因此 std::atomic<int>
将有效地专注于 int
.
对非 POD 类型使用 std::mutex
,请记住获取互斥量至少比总线锁慢一个数量级。
如果您仍然不确定,请测量性能。
how to use std::atomic<>
在上面的问题中,显然我们可以只使用std::mutex
来保持线程安全。我想知道什么时候用哪个。
classs A
{
std::atomic<int> x;
public:
A()
{
x=0;
}
void Add()
{
x++;
}
void Sub()
{
x--;
}
};
和
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--;
}
};
根据经验,对 POD 类型使用 std::atomic
,其中底层特化将能够使用一些聪明的东西,比如 CPU 上的总线锁(这不会给你更多的开销比管道转储),甚至是自旋锁。在某些系统上,int
可能 已经 是原子的,因此 std::atomic<int>
将有效地专注于 int
.
对非 POD 类型使用 std::mutex
,请记住获取互斥量至少比总线锁慢一个数量级。
如果您仍然不确定,请测量性能。