我了解到 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(count 检查来实现必要的同步。
那么,为什么我会在这里使用条件变量来代替对变量的轮询?它仍然在这里使用。为什么我不能在这里用互斥锁和一个简单的 if 子句实现同样的事情?最后,我想清楚地了解条件变量实际解决的问题是什么?
最佳答案
示例中的循环要么从不运行,要么运行一次,它从不循环(除非 pthread 以某种方式失败 - 因此它是一个循环而不是简单的 if
)。阅读评论:
Also, note that if COUNT_LIMIT is reached before this routine is run by the waiting thread, the loop will be skipped to prevent pthread_cond_wait from never returning.
这是一种预防措施,当你到达那里时已经满足条件,这样你就不会永远等待。
一旦条件变量被唤醒,count
变量就会增加,这样循环就会退出(增加 125,COUNT_LIMIT
为 12)。
这是一个多线程程序。您不能只看一个单独的函数并试图理解它的作用,而忽略其他线程。
关于c++ - Pthread 条件变量是连续轮询的替代品,是真的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9460613/