Мониторинг паттернов с помощью бустеров - PullRequest
1 голос
/ 05 февраля 2012

Будучи новичком в boost :: thread, на днях я пытался написать BlockingQueue (на мой взгляд, самая практичная конструкция синхронизации). Это достигается либо с помощью семафора, либо с помощью условной переменной, оба ранее выполнялись в Linux и Linux, но никогда не использовали boost.

Итак, на языках, где у вас есть «Монитор» (вы знаете, тот, что с блокировкой, ожиданием и уведомлением), вы просто используете это:

T BlockingQueue::take()
{
    scopelock(monitor);
    while (queue.empty())
        monitor.wait();

    T ret = queue.front();
    queue.pop();
    return ret;
}

Из того, что я могу сказать, "Монитор" выполняется с использованием boost :: condition_variable_any в тандеме с boost :: mutex. НО, condition_variable_any уже содержит мьютекс! (называется внутренним_mutex). Поэтому я сначала подумал, что условие_вариабельная_яйна - это весь монитор, но, как оказалось, мьютекс недоступен извне, и вы не можете заблокировать его перед ожиданием и т. Д.

Кто-нибудь знает, какова цель повышения :: condition_variable_any :: internal_mutex? В моем случае это действительно смутило меня, потому что я знаю, что ожидание pthread_cond_t должно выполняться с заблокированным мьютексом - но какой мьютекс ?? Спасибо.

...