【问题标题】:Safe way to ensure not missing cond signal确保不会丢失 cond 信号的安全方法
【发布时间】:2013-09-25 14:31:13
【问题描述】:

如果没有其他线程使用变量标志,这是确保主线程永远不会错过唤醒信号的安全方法吗?

void *Cancel_master_thread(void *arg)
{
  while (1)
  {
    flag = 0;
    pthread_mutex_lock(&cancel_in_progress);
    flag = 1;
    pthread_cond_wait(&cancel_finished, &cancel_in_progress);
    pthread_mutex_unlock(&cancel_in_progress);
  }
}

void *Cancel_slave_MB()
{
  while (1)
  {
    while (flag != 1)
    {
    }

    pthread_mutex_lock(&cancel_in_progress);
    pthread_cond_signal(&cancel_finished);
    pthread_mutex_unlock(&cancel_in_progress);
  }
}

【问题讨论】:

    标签: c multithreading pthreads producer-consumer


    【解决方案1】:

    更改主控的标志后,您必须让出处理器以便主控可以执行。 (通常。这里有关于线程和多处理器的长时间讨论。)所以你想要某种阻塞调用(如睡眠),以便主控器可以运行。目前,您的 Cancel_slave_MB 在一个紧密的循环中运行,所以没有其他任何东西有机会运行。

    编辑所以你的例子有点简单。如果您设置断点或 printf(在锁定区域之外),它们是否正确执行?我想说不要永远循环,这就是信号量的意义所在。

    【讨论】:

    • 但是我想要的只是主人在奴隶的信号到达时睡觉。因此,当标志的值为 1 时,主设备将休眠,只有这样,从设备才能锁定互斥锁并发送信号。不是吗?对于多处理器系统,线程是同时执行的。那么问题出在哪里?我忘了提到显然slave在解锁互斥锁cancel_in_progress后休眠了,我只是没有在发布的代码中结束pthread_cond_wait命令。
    • 是的,它们正常执行了很长时间,但不知何故主线程没有唤醒,所以一切都停止了......
    【解决方案2】:

    如果您的缩进是 cancel_master_thread()cancel_slave_MB() 中的一个 pthread_cond_signal() 执行一个 pthread_cond_wait()(在 while 循环中),那么按照以下方式执行:

    void * cancel_master_thread(void *arg)
    {
      pthread_mutex_lock(&cancel_in_progress);
    
      while (1)
      {
        pthread_cond_wait(&cancel_finished, &cancel_in_progress);
    
        /* do something per signal received */
      }
    
      pthread_mutex_unlock(&cancel_in_progress);
    }
    
    void * cancel_slave_MB()
    {
      while (1)
      {  
        /* do something */
    
        pthread_mutex_lock(&cancel_in_progress);
        pthread_cond_signal(&cancel_finished);
        pthread_mutex_unlock(&cancel_in_progress);
      }
    }
    

    【讨论】:

    • 这段代码有什么意义?我的意思是所有主线程都会做的就是在睡眠后睡觉......
    • @iiirxs:是的,当然,但是主人保证在每个信号上唤醒,不会错过任何信号。可能是我不明白您发布的代码的意图是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2016-07-20
    • 2017-03-14
    • 2014-01-18
    • 1970-01-01
    • 2011-11-24
    相关资源
    最近更新 更多