gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:18:30 25 4
gpt4 key购买 nike

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

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

No.1

{

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

setting_buffer();

pthread_cond_signal(&cond);

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

}

第二名

{

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() 是安全的。

关于c - 设置缓冲区和调用 pthread_cond_signal 时是否需要设置互斥锁/解锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55886834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com