【发布时间】:2014-01-28 16:56:16
【问题描述】:
我实现了一个简单的线程池,它使用std::list<Tasks> mTasks 作为任务列表。
所有线程都使用以下代码等待条件变量:
EnterCriticalSection(&mCriticalSection);
while(mTasks.size() ==0)
SleepConditionVariableCS(&mConditionVariable,&mCriticalSection, INFINITE);
直到有人在列表中添加了一些东西,然后其中一个被唤醒。
我用了一段时间来检查任务列表是否不为空,尽管唤醒的唯一方法是向列表中添加一个新任务(所以它不能为空),我这样做的原因是在 MSDN 中是这样写的:
条件变量会受到虚假唤醒(那些不是 与显式唤醒相关联)和被盗唤醒(另一个线程 设法在唤醒线程之前运行)。因此,您应该重新检查 睡眠操作后的谓词(通常在 while 循环中) 返回。
但是那些虚假的唤醒是什么,什么会唤醒我的变量?
【问题讨论】:
-
阻塞队列逻辑也应该在这里工作。
-
我添加了
winapi标签,但是其他操作系统也会发生虚假唤醒。 -
@Nawaz 我不明白你的评论
-
@OopsUser:搜索“阻塞队列”或“并发阻塞队列”。
-
@OopsUser:见
put()andtake()here的实现。您需要做的就是模仿类似的行为。
标签: c++ multithreading winapi