Будучи новичком в 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 должно выполняться с заблокированным мьютексом - но какой мьютекс ?? Спасибо.