gpt4 book ai didi

c - 如何确保pthread_cond_wait()不会丢失任何pthread_cond_signal()?

转载 作者:行者123 更新时间:2023-12-03 13:23:10 27 4
gpt4 key购买 nike

我有一个读取线程和多个写入线程,如下所示。
读线程:

pthread_mutex_lock(mutex);
while(1){
pthread_cond_wait(cond, mutex);
switch(state){
//do something
}
}
pthread_mutex_unlock(mutex);
写线程1:
pthread_mutex_lock(mutex);
state = work;
pthread_cond_signal(cond);
//do something
pthread_mutex_unlock(mutex);
写线程2:
pthread_mutex_lock(mutex);
state = lunch;
pthread_cond_signal(cond);
//do something
pthread_mutex_unlock(mutex);
假设 state是共享变量,并且读取线程在所有写入线程之前进入等待状态。
假设两个写线程尝试同时获取 mutex,而write1获取 mutex并发送 cond。目前,write2和read线程均已锁定在 mutex上,据我所知,没有线程优先于 mutex,因此我们无法确定write1何时释放readt会获取它的 mutex,这将导致信号丢失和状态被覆盖。
我在这里有两个问题:
  • 我的理解正确吗,以上情况是可能的吗?
  • 如果是这样,如何确保代码中没有信号丢失?
  • 最佳答案

    1. Is my understanding correct, that the above situation is possible?

    是的,你是对的。
    1. If so, how do I make sure that no signal is missed in my code.

    如果要确保“读取线程”注意到变量 state的每次更改,那么必须确保在“读取线程”确认之前,没有“写入线程”会更改变量 state。例如,您可以使“读取线程”读取 state的值,然后将该变量设置为特殊值,以向“编写者线程”指示 state现在可以被新值覆盖。
    但是,这意味着不仅“读取线程”必须等待“写入线程”,而且“写入线程”还必须等待“读取线程”。这是 producer-consumer problem。一种典型的解决方案是使用两个条件变量而不是一个:
  • 一个用于“写线程”的属性,用于向“读线程”指示已准备好读取新数据。
  • 一个“读取器线程”,用于指示“写入器线程”现在可以写入新数据。

  • 为了最大程度地减少相互等待的线程,您可能希望允许一次将多于一组的数据存储在程序中,例如,通过实现一个队列。

    关于c - 如何确保pthread_cond_wait()不会丢失任何pthread_cond_signal()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64815981/

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