假设有2
线程为 threadA
和 threadB
我们将使用 std::atomic<bool>
这些 threads
中的数据类型.所以现在我们有一些关键部分如下:
我的全局变量(线程同时访问它):
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
或交换声明? - 有没有可能发生什么问题,比如
memory
读取或写入flag
时出现问题? - 它在具有任何 CPU 架构的任何平台上都绝对安全吗?我的意思是(一个可移植的代码)。因为
atomic<bool>
在某些 X86 架构中不需要?
我只想使用 atomic
功能而不是 mutex
.
最佳答案
will be any trouble when using of
==
,assignment
,read/write
instead of (for example)std::atomic_load
orexchange
statements?
当 operator==
与 std::atomic<T>
一起使用和 T
, 它首先调用 atomic<T>::operator T()
至 load
使用最强内存排序的原子值 std::memory_order_seq_cst
.接下来,operator==(T, T)
用来。这个序列不是原子的。这意味着当比较实际发生时 std::atomic<T>
可能已经改变了。
just wanna use of atomic feature instead of
mutex
.
您可以使用 std::atomic::compare_exchange_weak 实现带有原子的自旋锁(有一个例子),但它不能像std::mutex
那样让线程进入休眠状态。
关于c++ - 在 C++ 中对 std::atomic<bool> 使用比较和读/写操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49225302/