我實現了一個簡單的ThreadPool,它使用std::list<Tasks> mTasks
作爲任務列表。什麼能喚醒條件變量
所有線程等待上使用下面的代碼條件變量:
EnterCriticalSection(&mCriticalSection);
while(mTasks.size() ==0)
SleepConditionVariableCS(&mConditionVariable,&mCriticalSection, INFINITE);
直到有人增加了一些到列表中,然後其中一人被喚醒。
我用了一段時間來檢查任務列表是否爲空,儘管唯一被喚醒的方法是向列表中添加一個新任務(所以它不能爲空),我這樣做的原因是因爲在MSDN它寫成:
條件變量受虛假喚醒(那些不 有一個明確的喚醒相關)和被盜喚醒(另一個線程 管理喚醒線程之前運行)。因此,在睡眠操作返回 之後,您應該重新檢查謂詞(通常在while循環中)。
但那些虛假喚醒是什麼,喚醒我的變量是什麼?
阻塞隊列邏輯也應該在這裏工作。 – Nawaz
我已經添加了'winapi'標籤,但是其他操作系統也會發生虛假喚醒。 – icabod
@Nawaz我不理解你的評論 – OopsUser