Я реализовал простой ThreadPool, который использует список std::list<Tasks> mTasks
для списка задач.Что может проснуться условной переменной
Все нити ждет на условной переменной, используя следующий код:
EnterCriticalSection(&mCriticalSection);
while(mTasks.size() ==0)
SleepConditionVariableCS(&mConditionVariable,&mCriticalSection, INFINITE);
Пока кто-то добавляет к списку, а затем один из них будить вверх.
Я использовал некоторое время, проверяя, что список задач не пуст, хотя единственный способ пробудиться - это добавить новую задачу в список (поэтому он не может быть пустым), причина, по которой я это сделал потому что в MSDN написано:
переменные условия подлежат паразитных пробуждениями (те, которые не связаны с явным следе) и угнанных пробуждениями (другой поток удается бежать до проснувшегося нити). Поэтому вам следует перепроверить предикат (обычно в цикле while) после операции ожидания .
Но что это за побочные пробуждения, что будет просыпать мою переменную?
Здесь также должна работать блокировка-очередь-логика. – Nawaz
Я добавил тэг 'winapi', однако ложные пробуждения происходят и на других ОС. – icabod
@Nawaz Я не понял ваш комментарий – OopsUser