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您需要知道编译时
位集
的大小。另请参阅此链接中标题为“向量专用化:向量”的部分:。具体地讲了关于<代码>中元素的引用,也考虑了…