[英]Is it safe to access (read) a bit from a bitset (C++) which may be modified by a different thread
這種操作是否安全? (換句話說,如果在不同的線程上修改了bitset,則沒有機會讀取一些虛假的中間值)? 具體來說,我只對讀取是否安全感興趣,換句話說,我不會問從兩個獨立的線程寫入一個bitset是否安全。
例如:無論是否同時設置/清除bs中的其他位,線程1是否可靠地獲得第5位的當前狀態?
std::bitset<64> bs;
//thread 1:
bool val;
val=bs.test(5);
// ...
//thread 2:
// set/clear a few bits
bs.set(1);
bs.set(3);
bs.set(5);
bs.reset(6);
// ...
Bitset不提供原子修改,因此位的更改可能會鎖定附近位中的較舊值。
如果存在重置(5),則可能意味着線程1從未看到設置位。
以這種方式使用std::bitset
不是線程安全的。
這是標准關於訪問bitset的內容(§20.9.2.2-51):
為了確定數據競爭的存在,通過結果引用的任何訪問或更新可能分別訪問或修改整個底層位集。
因此,在另一個執行線程中從其讀取時寫入bitset對象是數據爭用(觸發未定義的行為)。 即使所有線程都使用不同的索引訪問bitset對象。
沒有STL容器是線程安全的。 雖然您不會獲得中間值,但如果線程未同步,您最終可能會忽略一組值。 使用atomic
操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.