设置缓冲区和调用pthread_cond_signal时是否需要设置mutexlock / unlock

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设置缓冲区和调用pthread_cond_signal时是否需要设置mutexlock / unlock相关的知识,希望对你有一定的参考价值。

有两个线程。 No.1是生产者,No.2是消费者 1和2线程正在使用相同的缓冲区。

我想知道是否需要在1号线程上设置Mutex锁定/解锁。 你能指导一下吗?

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

}
答案

是的,您需要在信令/缓冲区设置端的某处锁定互斥锁。

条件变量必须始终与等待线程等待的共享状态的某些条件配对 - 这就是它被称为条件变量的原因。在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()

以上是关于设置缓冲区和调用pthread_cond_signal时是否需要设置mutexlock / unlock的主要内容,如果未能解决你的问题,请参考以下文章

pthread_cond_signal() 没有给信号线程足够的时间运行

条件变量

pthread_cond_wait 和 pthread_cond_signal 的性能

试图理解 pthread_cond_lock 和 pthread_cond_signal

pthread_cond_wait 丢失来自 pthread_cond_signal 的信号

pthread_cond_signal 虚假唤醒问题