我有一個
std::map<int, std::bitset<256 > > m;
構建后不會插入新密鑰,也不會洗掉任何密鑰。我可以在一個執行緒中安全地分配位集,同時在其他執行緒中讀取它而不使用互斥鎖嗎?
// thread 1:
std::bitset<256> a = getBitset();
m[1] = a;
// thread 2:
std::bitset<256> b = m[1];
// or alternatively
std::bitset<256> c = m.at(1);
我認為程式不會崩潰,但位集中可能會發生資料競爭。如果讀取將提供新舊位集的組合,則可以接受資料競爭。
uj5u.com熱心網友回復:
不,這不安全。
operator=
of the是一個修改操作,因此如果在另一個執行緒中同時訪問它bitset
,則不能保證不會出現資料競爭。bitset
在實踐中,它幾乎肯定會導致資料競爭,因為它需要寫入物件。這不是特定于std::bitset
,但對于幾乎所有非空非原子標準庫型別(以及大多數其他非空型別)通常都是如此。
任何資料競爭都會導致未定義的行為。沒有部分更新。從這個意義上說,它永遠不應該被接受。
如果您希望能夠做到這一點,要么用a包裝 abitset
以保護對走了。struct
mutex
bitset
shared_ptr
bitset
雖然我認為它不能保證,std::bitset
但也可能是微不足道的可復制的。您可以使用static_assert
onstd::is_trivially_copyable_v
和 if進行檢查,true
也可以使用std::atomic
orstd::atomic_ref
允許以原子方式訪問位集(即沒有資料競爭),并且可能僅在底層架構不支持對物件的原子訪問時才使用鎖的相應大小。
另請注意,std::bitset b = m[1];
andm[1]
也會導致未定義的行為,因為operator[]
ofstd::map
也是一個修改操作,并且未指定為免于資料競爭,即使它沒有將新元素插入到地圖中。您將需要使用例如find()
成員函式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/469283.html
上一篇:嵌套字典操作