确保不丢失cond信号的安全方法

时间:2013-09-25 14:31:14

标签: c multithreading pthreads producer-consumer

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

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

2 个答案:

答案 0 :(得分:0)

更改主服务器的标志后,必须生成处理器,以便主服务器可以执行。 (通常。这里有很多关于线程和多处理器的讨论。)所以你想要进行某种阻塞调用(比如睡眠),这样主人就可以运行了。目前,您已经在紧密循环中运行Cancel_slave_MB,因此没有其他任何机会可以运行。

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

答案 1 :(得分:0)

如果您的缩进是cancel_master_thread()pthread_cond_wait()pthread_cond_signal() - 循环中)cancel_slave_MB()只执行一个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);
  }
}