Если в TaskList есть какой-то метод wait_until_not_empty, используйте его.Если это не так, то один Sleep (1000) (или какое-либо другое значение) может просто сделать трюк.Правильным решением было бы создать оболочку вокруг TaskList, которая использует дескриптор события auto-reset , чтобы указать, не является ли список пустым.Вам нужно будет заново изобрести текущие методы для pop / push, с новым списком задач, являющимся членом нового класса:
WaitableTaskList::WaitableTaskList()
{
// task list is empty upon creation
non_empty_event = CreateEvent(NULL, FALSE, FALSE, NULL);
}
Task* WaitableTaskList::wait_and_pop_front(DWORD timeout)
{
WaitForSingleObject(non_empty_event, timeout);
// .. handle error, return NULL on timeout
Task* result = task_list.pop_front();
if (!task_list.empty())
SetEvent(non_empty_event);
return result;
}
void WaitableTaskList::push_back(Task* item)
{
task_list.push_back(item);
SetEvent(non_empty_event);
}
Вы должны добавлять элементы в список задач только с помощью таких методов, как этот wait_and_pop_front()
.
РЕДАКТИРОВАТЬ: на самом деле это не хорошее решение.Существует способ поднять non_empty_event, даже если список пуст.Ситуация требует 2 потоков, пытающихся выскочить и перечислить 2 элемента.Если список становится пустым между if и SetEvent, у нас будет неправильное состояние.Очевидно, что нам также необходимо реализовать синхронизацию.В этот момент я бы снова пересмотрел простой сон: -)