0

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

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

2 回答 2

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);
  }
}
于 2013-09-28T12:10:49.023 回答
0

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

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

于 2013-09-25T15:11:43.590 回答