Вместо того, чтобы срок действия объекта блокировки истек до того, как он разблокируется, вы можете попытаться вручную разблокировать мьютекс в PushMessage()
, прежде чем разблокировать ожидающий поток, т. Е.
void PushMessage(MyMessage m) // Thread 1 calls this
{
boost::mutex::scoped_lock lock(mMutex);
mQueue.push_back(m);
lock.unlock(); // <== manually unlock
mCondition.notify_one();
}
Таким образом, когдапоток 2 разблокируется, не будет времени "перехода", когда поток 1 содержит блокировку, а поток 2 пытается получить блокировку вашего мьютекса.Я не понимаю, почему это может создать проблемы, но опять же, по крайней мере, у вас не будет потока 2, пытающегося вызвать lock.lock()
, в то время как поток 1 все еще содержит блокировку.