C++11: Синхронизация - Условные переменные и ложные пробужде
От: rsdn_179b  
Дата: 01.04.15 23:29
Оценка:
Здравствуйте гуру, знатоки и просто ценители C++ !

Интересует собственно сабж — откуда берутся эти самые "ложные пробуждения" ?

Поиск по форуму к сожалению не дал ответа на этот вопрос.

Например гражданин Кодт в одном из постов
Автор: Кодт
Дата: 08.04.13
пишет следующее:

... Правильный взгляд даёт понимание таких вещей, и как ложные пробуждения ...


Но к сожалению не объясняет самой сути этого явления.

Зачем крутиться в цикле и проверять какие-то условия


Пример кода взят с "CodeProject":

#include <thread>
#include <mutex>
#include <condition_variable>
#include <iostream>
#include <queue>
#include <random>

...
std::mutex              g_lockqueue;
std::condition_variable g_queuecheck;
...
bool                    g_notified;



void workerfunc(int id, std::mt19937& generator)
{
    ...
    g_notified = true;
    g_queuecheck.notify_one();
    ...
}

void loggerfunc()
{
    ...
    std::unique_lock<std::mutex> locker(g_lockqueue);

    while(!g_notified) // used to avoid spurious wakeups 
    {
        g_queuecheck.wait(locker);
    }
    ...
}





Надеюсь на содержательные ответы. Всем ответившим заранее спасибо.


П.С.: Ссылки на соответствующие учёные книги приветствуются
условные переменные ложные пробуждения spurious wakeups condition variables
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.