boost::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;
    }
}

и я получаю это в стандартный вывод:

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

....и так далее. signal() не называется. Я напечатал this чтобы показать, что мы работаем над тем же объектом.

Как возможно / в каких сценариях может произойти? `'foo вводится дважды изначально (и портится с остальной логикой), пока он защищен мьютексом!

Я ценю ваши решения. Спасибо

1 ответ

Как возможно / в каких сценариях может произойти? `'foo вводится дважды изначально (и портится с остальной логикой), пока он защищен мьютексом!

Это произошло бы, когда другой поток обращается _container без синхронизации на том жеmutex,

Другие вопросы по тегам