Pthread条件变量是连续轮询的替代,是真的吗?

时间:2012-02-27 05:53:33

标签: c++ c pthreads conditional mutex

我了解到pthread条件变量提供了替换轮询的工具。如果没有条件变量,程序员需要让线程连续轮询(可能在关键部分),以检查是否满足条件。这可能非常耗费资源,因为线程将在此活动中持续忙碌。条件变量是一种在没有轮询的情况下实现相同目标的方法。但为什么在代码中我需要不断检查变量是否使用条件。那么使用条件变量有什么好处?

  pthread_mutex_lock(&count_mutex);

  while (count<COUNT_LIMIT) {
    pthread_cond_wait(&count_threshold_cv, &count_mutex);
    printf("watch_count(): thread %ld Condition signal received.\n", my_id);
    count += 125;
    printf("watch_count(): thread %ld count now = %d.\n", my_id, count);
  }

  pthread_mutex_unlock(&count_mutex);

现在在the above example我看到我需要轮询我是否使用条件变量。那么在不需要轮询的意义上,条件变量的好处是什么?互斥锁可以实现必要的同步,使用if(计数检查。

那么,为什么我会在这里使用条件变量来替换变量上的轮询?它仍然在使用中。为什么我不能用mutex和简单的if子句来实现同样的东西?最后,我想清楚地了解条件变量实际解决的问题是什么?

1 个答案:

答案 0 :(得分:1)

示例中的循环要么永远不运行要么运行一次,它永远不会循环(除非pthread以某种方式失败 - 并且它是一个循环而不是简单的if)。阅读评论:

  

另请注意,如果在运行此例程之前达到COUNT_LIMIT   通过等待线程,将跳过循环以防止   pthread_cond_wait从不回来。

当你到达那里时已经满足条件的情况下,这是一个预防措施,所以你不会永远等待。

唤醒条件变量后,count变量会递增,以便循环退出(递增125,COUNT_LIMIT为12)。

这是一个多线程程序。您无法查看单个分离函数并尝试理解它的作用,忽略其他线程。