Pthread条件变量是连续轮询的替代品,是真的吗
Pthread Condition variables are a replacement for continuous polling, is it true?
我了解到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);
现在,在上面的例子中,我看到我需要轮询是否使用条件变量。那么在不需要轮询的意义上,条件变量的好处是什么互斥可以通过if(count check.实现必要的同步
那么,为什么我要在这里使用条件变量来代替对变量的轮询呢?它还在这里使用。为什么我不能用互斥和一个简单的if子句来实现同样的事情呢?最后,我想对条件变量实际解决的问题有一个清晰的想法?
示例中的循环要么从不运行,要么只运行一次,它从不循环(除非pthread以某种方式失败——为此,它是一个循环,而不是简单的if
)。阅读评论:
此外,请注意,如果在运行此例程之前达到COUNT_LMIT等待线程将跳过循环以防止pthread_cond_wait从不返回。
当你到达那里时,条件已经满足,这是一种预防措施,这样你就不会永远等待。
一旦条件变量被唤醒,count
变量被递增,从而循环将退出(递增125,COUNT_LIMIT
为12)。
这是一个多线程程序。你不能只看一个分离的函数,就试图理解它的作用,而忽略其他线程。
相关文章:
- 如何在 std::vector 中找到<bool>哪些索引是真的?
- int8_t和uint8_t真的是整数吗?它们有什么用?
- 你如何理解"std: :forward is just syntactic sugar"?这是真的吗?
- 指向数组unique_ptr在调用 release() 后会自动释放动态内存,这是真的吗?
- 列表的向量真的是向量吗?
- 一个C++编译器是为不同的平台(Linux,Windows等)多次编写的,这是真的吗?
- array::operator[] 真的是 noexexcept 吗?
- 数组的维度是在创建数组的那一刻确定的,以后不能更改的,这是真的吗?
- SSE42 & STTNI - PcmpEstrM比PcmpIstrM慢两倍,是真的吗?
- 当内存被分配到Windows中的进程中时,它总是会触发页面错误,这是真的吗
- 即使有C++11/14,给出的答案仍然是"Why switch statement cannot be applied on strings?"真的吗?
- 是的,构造函数返回是当前实例,但我们不能使用返回类型.是真的吗
- Pthread条件变量是连续轮询的替代品,是真的吗
- 在编译时计算C字符串的长度.这真的是constexpr吗
- int**= int*[] 对于数组来说,这是真的吗?
- O'Reilly "Objective-C Pocket Reference"声称C++不支持动态调度,这是真的吗?
- 当类的指针实例超出范围时不调用析构函数是真的吗?
- std::bind 绑定"by value",这是真的吗?
- 为iOS和Android编译c++代码(Xcode).这是真的吗?
- 表达"(ptr == 0) != (ptr == (void*)0)"真的是真的吗?