Я расширяю кодовую базу. Посмотрите на следующий фрагмент кода, взятый из класса. Я сделал это как можно проще, чтобы не запутать вас:
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 вводится дважды изначально (и портится с остальной логикой), пока он защищен мьютексом!
Я ценю ваши решения.
Спасибо
Как возможно / в каких сценариях может произойти? `’foo вводится дважды изначально (и портится с остальной логикой), пока он защищен мьютексом!
Это произошло бы, когда другой поток обращается _container
без синхронизации по тот же самый mutex
.
Других решений пока нет …