C++ 多线程代码:vector<;布尔>;迭代器不兼容
以下代码旨在返回尚未使用的最小非负整数。它是从多个线程调用的。如果样式看起来有点奇怪,那是因为这个类的目的是在一个只有头的库中C++ 多线程代码:vector<;布尔>;迭代器不兼容,c++,visual-studio,multithreading,C++,Visual Studio,Multithreading,以下代码旨在返回尚未使用的最小非负整数。它是从多个线程调用的。如果样式看起来有点奇怪,那是因为这个类的目的是在一个只有头的库中 class Unique { public: static unsigned int getIndex() { boost::unique_lock<boost::mutex> lock(get().mutex); unsigned int index = 0; while (index <
class Unique
{
public:
static unsigned int getIndex()
{
boost::unique_lock<boost::mutex> lock(get().mutex);
unsigned int index = 0;
while (index < get().valueInUse.size() && get().valueInUse[index])
index++;
if (index == get().valueInUse.size()) get().valueInUse.push_back(true);
get().valueInUse[index] = true;
return index;
}
static void releaseIndex(unsigned int index)
{
boost::unique_lock<boost::mutex> lock(get().mutex);
get().valueInUse[index] = false;
}
private:
static Unique &get()
{
static Unique s;
return s;
}
boost::mutex mutex;
std::vector<bool> valueInUse;
};
类唯一
{
公众:
静态无符号整型getIndex()
{
boost::unique_lock(get().mutex);
无符号整数索引=0;
而(索引
此代码偶尔会出现调试时间问题:
vector<bool> iterators incompatible
向量迭代器不兼容
堆栈跟踪显示发生在push_back()
-索引中的问题为零。STL实现似乎认为它正在插入另一个vector
实例的end()
。使用VisualStudio2010Express
有什么想法吗?此代码是线程安全的,不是吗?除非您保证在创建任何线程之前调用它一次,否则get
函数肯定不是线程安全的。由于您使用get
调用获取互斥来保护其余代码,因此肯定会得到一些意外的结果
std::vector
被明确地专门化为每bool使用一位,这样就改变了迭代结果(我相信它使用了一个代理对象)。您是否尝试过使用deque
而不是vector
作为测试?除非您保证在创建任何线程之前调用它一次,否则get
函数肯定不是线程安全的。由于您使用get
调用获取互斥来保护其余代码,因此肯定会得到一些意外的结果
std::vector
被明确地专门化为每bool使用一位,这样就改变了迭代结果(我相信它使用了一个代理对象)。您是否尝试过使用deque
而不是vector
作为测试?而不是vector
您可以使用std::bitset
()。@yasouser您需要在编译时知道位集的大小。另请参阅此链接中标题为“向量专用化:vector”的部分:。它专门讨论了对向量中元素的引用而不是向量
您可以使用std::bitset
()。@yasouser您需要知道编译时位集
的大小。另请参阅此链接中标题为“向量专用化:向量”的部分:。具体地讲了关于<代码>中元素的引用,也考虑了…