[英]Using compare and read/write operations for std::atomic<bool> in c++?
假设有2
线程作为threadA
和threadB
,我们将在这些threads
使用std::atomic<bool>
数据类型。 因此,下面是一些关键部分:
我的全局变量(并发线程访问):
std::atomic<bool> flag;
线程A:
void *threadA(void *arg)
{
bool ttt = true;
if(flag == true) // comparison operator ==
// do something
// something to do
flag = false; // assign a avalue
ttt = flag; // read operation
return 0;
}
线程B:
void *threadB(void *arg)
{
bool m = true;
if(flag == true) // comparison operator ==
flag = false;
// something to do
flag = true; // assign a value
m = !flag; // read operation
return 0;
}
无论如何,我知道std::atomic<>
与普通数据类型不同,它们是自由竞争者,但是我想确定这些:
==
, assignment
, read/write
而不是(例如) std::atomic_load
或exchange语句时会遇到什么麻烦? flag
时发生任何麻烦,例如memory
问题? atomic<bool>
? 我只是想使用atomic
特性而不是mutex
。
使用
==
,assignment
,read/write
而不是(例如)std::atomic_load
或exchange
语句时会遇到什么麻烦?
当将operator==
与std::atomic<T>
和T
,它将首先使用最强的内存排序std::memory_order_seq_cst
调用atomic<T>::operator T()
来load
原子值。 接下来,使用operator==(T, T)
。 此序列不是原子的。 这意味着,当实际进行比较时, std::atomic<T>
可能已经更改。
只是想使用原子特性而不是
mutex
。
您可以使用std :: atomic :: compare_exchange_weak使用原子实现自旋锁(有一个示例),但是它无法像std::mutex
那样使线程进入睡眠状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.