2013-10-07 69 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