boost :: scoped_lock无效(对我来说)

时间:2015-10-09 17:57:55

标签: c++ multithreading boost mutex scoped-lock

我正在扩展代码库,看一下从类中取出的以下代码片段。我尽量简单,不要混淆你:

std::queue< boost::shared_ptr<const Item> > _container;
boost::mutex _mutex;
//...
void foo(Item *item)
{
    boost::mutex::scoped_lock lock(_mutex);
    std::cout << "enter " << _container.size() << "  " << this << std::endl;
    boost::shared_ptr<const Item> instr(item);
    _container.push( instr );

    // we only need to signal when size turns from 0 --> 1
    if (_container.size() == 1)
    {
        std::cout << "SIGNALLING" << "  " << this << std::endl;
        signal();//pop the _container until empty
    }
    else
    {
        std::cout <<"NOT SIGNALLING " << _container.size() << "  " << this << std::endl;
    }
}

我在stdout中得到了这个:

enter 0  0xe919f0
enter 1  0xe919f0
NOT SIGNALLING 2  0xe919f0
enter 2  0xe919f0
NOT SIGNALLING 3  0xe919f0

....等等。 signal()未被调用。我打印this表示我们在同一个对象上操作。

可能/在什么样的情况下会发生什么? `&#39; foo最初输入两次(并且与其余逻辑相混淆),同时受到互斥锁的保护!

感谢您的解决方案。 谢谢

1 个答案:

答案 0 :(得分:-1)

  

可能/在什么样的情况下会发生什么? `&#39; foo最初输入两次(并且与其余逻辑相混淆),同时受到互斥锁的保护!

当另一个线程访问_container而未同步相同的mutex 时,会发生这种情况。