一、条件变量+互斥锁
生产者
{
unique_lock<mutex> lck(mutex);
if(不满足生产条件)
{
consume.wait(lck);
}
//执行生产操作
produce.notify_all();
lck.unlock();
}
消费者
{
unique_lock<mutex> lck(zhmutex);
while (不满足消费条件)
{
produce.wait(lck);
}
//执行消费操作
consume.notify_all();
lck.unlock();
}
满足了如下的应用场景:线程等待不定期的命令输入,命令输入几秒一次
第二种应用场景:当生产者频繁输入,而消费者消费不及时,如果用上面的代码,会出现下面这种情况,生产者频繁写入,并唤醒条件变量,但是此时消费者没有等待唤醒,而是在执行耗时操作,则会出现唤醒丢失的情况,测试发现确实如此。
因此我考虑使用 信号量+互斥锁的方式,代码如下:
std::mutex zhmutex;
QSemaphore entrysem;
生产者
{
unique_lock<mutex> lck(mutex);
//生产操作 (仅对生产使用了信号量)
lck.unlock();
entrysem.release();
}
消费者
{
entrysem.acquire();
unique_lock<mutex> lck(zhmutex);
//消费操作
lck.unlock();
}
测试后发现,在消费者中加入耗时操作,比如 sleep,然后生产者频繁输入,消费者虽然因耗时操作消费较慢,但是不会出现唤醒丢失的情况。