2013-10-07 129 views
0

我使用boost :: dynamic_bitset來跟蹤多個tcp連接。如果連接,則設置爲1,否則設置爲0.每個連接都是一個線程。我是否需要保護多線程中的位集?或者它沒有必要,因爲它在創建之後不會修改位集的大小?boost :: dynamic_bitset多線程問題

+0

取決於implmentation,但可能是因爲hw不存儲/讀取單個位。 – NoSenseEtAl

回答

1

在bitset中工作時,實際操作單個位是非常罕見的。通常情況下,下面的事情發生了:

  1. 負載x字節(X取決於你的機器和實際執行上)
  2. 操縱特定位在此位集的容器,這些字節
  3. 保存x字節。

這不是boost::dynamic_bitset具體,它也涉及std::bitset例如。你應該總是看看這種情況下的文檔。由於documentation沒有提到明確的線程安全性,因此您可能會遇到競爭狀況。

所以你應該保護你的bitset。

+0

謝謝。沒有使用bitset,有沒有更好的方法沒有使用鎖?使用原子整數。 –

+0

@MichaelD:這取決於你的數據結構。如果您將連接組織爲'class/struct Connection',則可以簡單地向它們添加一個原子布爾/標誌成員'alive'。您也可以使用一組原子變量(例如'std :: vector >'),但請記住,在這種情況下不能修改容器本身。 – Zeta