В среде выполнения параллелизма, представленной в VS2010, существует класс concurrent_queue. Он имеет функцию блокировки try_pop().
Как и в случае блоков Intel Thread Building Blocks (TBB), блокировка pop() была удалена при переходе от версии 2.1 в 2.2.Почему concurrent_queue не блокирует?
Интересно, в чем проблема с блокирующим вызовом. Почему он был удален из TBB? И почему нет блокировки concurrent_queue?
Я в ситуации, когда мне нужна блокирующая параллельная очередь, и я не хочу оживленного ожидания. Помимо написания очереди самостоятельно, есть ли другая возможность в среде выполнения параллелизма?
с блокирующим 'pop', вы можете * реализовать *«классический производитель-потребитель»с использованием TBB примерно две строки кода, без необходимости писать какие-либо примитивы синхронизации самостоятельно. (Потребитель 'while (true) потребляет (Q.pop());' и производитель делает 'while (true) Q.push (product());'.) Без блокировки 'pop', та же проблема требуется как минимум в два раза больше кода, а именно, бухгалтерия - дополнительная переменная условия для каждой очереди. Но, как говорит paxdiablo, 'tbb :: concurrent_bounded_queue' продолжает обеспечивать блокирующую функцию' pop', и в основном является заменой замены для 'concurrent_queue'. – Quuxplusone