簡體   English   中英

從bitset(C ++)訪問(讀取)位是否安全,可以由不同的線程修改

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM