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

标签 c++ c pthreads conditional-statements 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(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/

相关文章:

c++ - 为什么这个模仿 `vector` 的迭代器初始化的构造函数可以工作?

c - 将数据上传至 MAX 7219

c - 指向空数组的指针

multithreading - 向条件变量发送信号时必须保持锁定吗?

c++ - pthread_mutex 锁是否比用户在代码中强加的内存屏障提供更高的性能

c++ - C++中的隐式类型转换字母

c++ - 初始化私有(private)静态变量c++

在同一 C 程序中从一个函数调用其他函数

c - 解决死锁时的奇怪行为

c++ - MFC:环 - 无颜色变化