[英]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.