gpt4 book ai didi

c++ - 什么可以唤醒一个条件变量

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:48 26 4
gpt4 key购买 nike

我实现了一个使用 std::list<Tasks> mTasks 的简单线程池用于任务列表。

所有线程使用以下代码等待条件变量:

EnterCriticalSection(&mCriticalSection);

while(mTasks.size() ==0)
SleepConditionVariableCS(&mConditionVariable,&mCriticalSection, INFINITE);

直到有人向列表中添加内容,然后其中一个被唤醒。

我用了一段时间检查任务列表是否为空,虽然唤醒的唯一方法是向列表添加一个新任务(因此它不能为空),我这样做的原因是因为在 MSDN 中它是这样写的:

Condition variables are subject to spurious wakeups (those not associated with an explicit wake) and stolen wakeups (another thread manages to run before the woken thread). Therefore, you should recheck a predicate (typically in a while loop) after a sleep operation returns.

但是那些虚假唤醒是什么,什么会唤醒我的变量?

最佳答案

我在大学学习时对这个主题的理解是,从性能的角度来看,实现 100% 安全的条件变量成本太高。

关于 spurious wakeups 的维基百科页面引用 David R. Butenhof(Programming with POSIX Threads 的作者)的话:

This means that when you wait on a condition variable, the wait may (occasionally) return when no thread specifically broadcast or signaled that condition variable. Spurious wakeups may sound strange, but on some multiprocessor systems, making condition wakeup completely predictable might substantially slow all condition variable operations. The race conditions that cause spurious wakeups should be considered rare

while 循环中检查条件是一个很好的做法,肯定会避免这个问题。

关于为什么会发生这种情况的更多详细信息,我很抱歉,但我无法提供此类见解。

关于c++ - 什么可以唤醒一个条件变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21411912/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com