queueLIFO
is QList
// This function is run by the thread `Producer`.
void *threadProducerFunction (void *arg)
{
Q_UNUSED (arg);
while (1)
{
if (queueLIFO.length () < 10)
{
pthread_mutex_lock (&mutexVariable);
queueLIFO.push_back (1);
pthread_mutex_unlock (&mutexVariable);
}
else
{
pthread_mutex_lock (&mutexVariable);
pthread_cond_wait (&conditionVariable, &mutexVariable);
}
}
return NULL;
}
现在,考虑以下信息从这个链接:https://computing.llnl.gov/tutorials/pthreads/#ConVarSignal
pthread_cond_wait()
-这个例程应该在互斥锁时被调用,它会在等待时自动释放互斥锁。接收到信号后,线程被唤醒,互斥锁自动锁定供线程使用。
程序员负责在线程使用完互斥锁后解锁互斥锁。
当从另一个线程接收到信号时,pthread_cond_wait
将为这个线程的使用锁定互斥锁,这意味着在我的情况下,控制将进入if语句,其中互斥锁已经被pthread_cond_wait
锁定(来自else条件),我们现在再次锁定它。
我是否以错误的方式编写了代码逻辑?如何?
在检查状态之前,您应该始终保持锁。
pthread_mutex_lock (&mutexVariable);
while (queueLIFO.length() >= 10) {
pthread_cond_wait (&conditionVariable, &mutexVariable);
}
queueLIFO.push_back (1);
pthread_mutex_unlock (&mutexVariable);