используя мьютекс в качестве условной переменной - PullRequest
2 голосов
/ 17 июня 2011

Приведенный канонический пример для условных переменных

pthread_mutex_lock(&count_mutex);
pthread_cond_wait(&count_threshold_cv, &count_mutex);

Затем я могу отправить сигнал из другого потока, и этот поток будет продолжен.

Но я не вижу, что не так с простой попыткой блокировки мьютекса, и если блокировка будет снята, поток будет ожидать освобождения блокировки мьютекса.

Единственная проблема в этом подходе - постоянный опрос?

Спасибо

Ответы [ 2 ]

7 голосов
/ 17 июня 2011

Давайте сделаем этот бетон.Предложенная альтернатива условным переменным состоит в том, чтобы «официант» делал это:

loop:
    lock mutex
    check predicate
    if (predicate is false)
        unlock mutex
        sleep a bit // (is this what you had in mind?)
        goto loop

И «сигнализатор» делал это:

    lock mutex
    make predicate true
    unlock mutex

Здесь «предикат» можетнапример, «очередь не пуста».

При таком подходе есть две проблемы.Первый - это тот, который вы определили: постоянный опрос неэффективен.Если вы представляете сотни или тысячи потоков во всей системе, пытающихся работать таким образом, это поставит систему на колени.Или ваш «сон немного» должен был быть настолько длинным, что сами по себе сон усугублял бы раздражающие задержки.

Вторая проблема более тонкая.Нет гарантии, что когда поток разблокирует мьютекс, а затем снова его блокирует, другому потоку, ожидающему этот мьютекс, будет разрешено работать.(Это свойство мьютекса называется "справедливостью"; мьютекс, обеспечивающий его, называется "справедливым". POSIX не требует, чтобы мьютексы были справедливыми.) Независимо от того, как долго вы спите в "waiter ", нет никакой гарантии, что" сигнализатор " когда-либо справится с вызовом lock mutex.

Переменные условия решат обе эти проблемы.

0 голосов
/ 17 июня 2011

Переменные условия сигнализируют об изменениях в структурах данных, защищенных мьютексами.Например, у вас может быть очередь, защищенная мьютексом, и когда она становится пустой, вы хотите, чтобы потребитель ожидал переменную условия, пока очередь больше не будет пустой.Вы хотите атомарно освободить мьютекс и ждать в этой ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...