如何避免互斥变量被同一线程锁定两次



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);

最新更新