我了解到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子句来实现同样的东西?最后,我想清楚地了解条件变量实际解决的问题是什么?
答案 0 :(得分:1)
示例中的循环要么永远不运行要么运行一次,它永远不会循环(除非pthread以某种方式失败 - 并且它是一个循环而不是简单的if
)。阅读评论:
另请注意,如果在运行此例程之前达到COUNT_LIMIT 通过等待线程,将跳过循环以防止 pthread_cond_wait从不回来。
当你到达那里时已经满足条件的情况下,这是一个预防措施,所以你不会永远等待。
唤醒条件变量后,count
变量会递增,以便循环退出(递增125,COUNT_LIMIT
为12)。
这是一个多线程程序。您无法查看单个分离函数并尝试理解它的作用,忽略其他线程。