Multithreading 发出条件变量信号时必须保持锁定?

Multithreading 发出条件变量信号时必须保持锁定?,multithreading,pthreads,Multithreading,Pthreads,嗯。这里的示例是使用c中的pthread lib提供的 在教科书中,我遇到了以下代码: //for thread 2 pthread_mutex_lock(&lock); should_wake_up = 1; pthread_cond_signal(&cond); pthread_mutex_unlock(&lock); 这段代码运行得很好。我只是想知道下面的代码是否也可以工作 //for thread 2 pthread_mutex_lock(&lock);

嗯。这里的示例是使用c中的pthread lib提供的

在教科书中,我遇到了以下代码:

//for thread 2
pthread_mutex_lock(&lock);
should_wake_up = 1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&lock);
这段代码运行得很好。我只是想知道下面的代码是否也可以工作

//for thread 2
pthread_mutex_lock(&lock);
should_wake_up = 1;
pthread_mutex_unlock(&lock);
pthread_cond_signal(&cond);//signal the conditional variable but the lock is not held
以下代码的优点和缺点是什么

PS.假设协作线程具有以下代码:

//for thread 1
pthread_mutex_lock(&lock);
while(!should_wake_up)
    pthread_cond_wait(&cond, &lock);
pthead_mutex_unlock(&lock);

PS2。我遇到了另一个问题,它指出,如果我们不希望信号丢失,我们必须使用lock来确保在线程1中持有锁时,关联的谓词(在本例中为should_wake_up)不能更改。在这种情况下,这似乎不是问题所在。链接到帖子:[1]:。我认为他的问题是他忘记了锁定。但是我的问题不同。

对于正常使用,您可以在发送条件变量之前解锁互斥锁

互斥锁保护共享状态(在这种情况下,
应该唤醒
标志)。如果修改共享状态时锁定了互斥体,并且在检查共享状态时,可以在不锁定互斥体的情况下调用
pthread\u cond\u signal
,一切都将按预期工作


在大多数情况下,我建议在调用
pthread\u mutex\u unlock
之后调用
pthread\u cond\u signal
,作为一种轻微的性能改进。如果在
pthread\u mutex\u unlock
之前调用
pthread\u cond\u signal
,则在解锁互斥锁之前,等待的线程会被该信号唤醒,因此等待的线程必须返回睡眠状态,因为它会阻塞仍由信令线程保持的互斥锁。

每次询问此问题时,正确解释问题的人和从根本上误解问题的人之间展开了一场恶毒的辩论。您需要在
*\u wait()
-ing任务和
*\u signal()
-ing任务之间有一个共享谓词,并且该状态必须由互斥锁保护,因为它是从多个线程并发访问的。condvar本身也必须受到互斥锁的保护。互斥量(mutex?)必须相同。因此,
signal()
-er必须在修改共享状态之前对互斥体进行aqcuired。它不必再持有锁了。