在 c++ 中使用 std::atomic 的比较和读/写操作<bool>?
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
或交换报表时会有什么麻烦吗? - 是否有可能发生任何麻烦,例如在读取或写入
flag
时出现memory
问题? - 在任何具有任何CPU架构的平台上是否绝对安全?我的意思是(便携式代码(。因为在某些 X86 架构中不需要
atomic<bool>
?
我只想使用atomic
功能而不是mutex
.
使用
==
、assignment
、read/write
而不是(例如(std::atomic_load
或exchange
语句时会有什么麻烦吗?
当operator==
与std::atomic<T>
和T
一起使用时,它首先调用atomic<T>::operator T()
来使用最强的内存排序std::memory_order_seq_cst
来load
原子值。接下来,使用operator==(T, T)
。此序列不是原子序列。这意味着当比较实际发生时,std::atomic<T>
可能已经发生了变化。
只想使用原子特征而不是
mutex
.
您可以使用 std::atomic::compare_exchange_weak(有一个示例(实现带有原子的旋转锁,但它无法像std::mutex
那样使线程进入睡眠状态。
相关文章:
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 重载操作程序时出错>>用于类中的字符串 memebr
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 对字符串进行位操作
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 我可以在 C++ 中的函数体之外进行操作吗?
- MPI突然停止了对多个核心的操作
- <<操作员在下面的行中工作
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 对字符数组中的元素执行逐位操作
- 如何在directx/c++中进行平移/缩放操作
- 逐位操作的隐式类型转换
- 为什么一个向量上的多线程操作很慢
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 位移操作和位掩码未检测到重复字符
- 如何进行特定的位操作?
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 字符串操作 - 字符计数
- c++11的特定过载<<操作人员