设置缓冲区并调用pthread_cond_signal时是否需要设置互斥锁/解锁

时间:2019-04-28 03:44:20

标签: c pthreads mutex condition-variable

有两个线程。
第一是生产者,第二是消费者
1和2线程使用相同的缓冲区。

我想知道是否需要在1号线程上设置互斥锁。 您可以为此提供指导吗?

1号

{

 /*[Need here Mutex lock? pthread_mutex_loc(&mut);]*/

 setting_buffer();

 pthread_cond_signal(&cond);

 /*[Need here Mutex unLock? pthread_mutex_unlock(&mut);]*/

}

2号

{

 pthread_mutex_loc(&mut);

 pthread_cond_wait(&cond, &mut);


 consumming_buffer();


 pthread_mutex_unlock(&mut);

}

1 个答案:

答案 0 :(得分:0)

是的,您确实需要将互斥锁锁定在信令/缓冲区设置端的某个位置。

条件变量必须始终始终与等待线程正在等待的共享状态上的某些条件配对,这就是为什么它被称为条件变量的原因。等待pthread_cond_wait()返回后,等待方必须始终重新检查其等待的条件-即使尚未发出信号,也可以提前返回。在几乎所有情况下,这意味着您应该在检查条件的循环中调用pthread_cond_wait()

pthread_mutex_lock(&mut);

while (!buffer_is_set())
    pthread_cond_wait(&cond, &mut);

consume_buffer();

pthread_mutex_unlock(&mut);

buffer_is_set()条件必然要查看另一个线程正在更新的共享状态,因此另一个线程还必须锁定互斥锁以防止争用该状态:

 pthread_lock(&mut);

 setting_buffer(); /* Now buffer_is_set() will return true */

 pthread_cond_signal(&cond);

 pthread_unlock(&mut);

请注意,互斥锁只需要围绕setting_buffer()调用进行锁定-解锁互斥锁后可以安全地调用pthread_cond_signal()