Это зависит от характера вашей философии многопоточности. Для тех из нас, кто предпочитает обмен последовательными процессами, очередь с блокировкой почти идеальна. Фактически, идеальным было бы такое сообщение, при котором никакое сообщение не может быть помещено в очередь, если получатель не готов его принять.
Так что нет, я не думаю, что очередь с блокировками идет вразрез с самой целью многопоточности. Фактически, сценарий, который вы описываете (основной поток в конечном итоге останавливается), является хорошей иллюстрацией основной проблемы с актор-моделью многопоточности; вы не знаете, будет ли это взаимоблокировка / блокировка, и вы также не можете полностью проверить это.
Напротив, представьте себе блокирующую очередь с нулевым объемом сообщений. Таким образом, чтобы система работала вообще, вам нужно будет найти способ гарантировать, что регистратор всегда гарантированно сможет получить сообщение из основного потока. Это CSP. Это может означать, что в вашем гипотетическом потоке регистратора у вас должна быть буферизация, определяемая приложением (в отличие от лучшего предположения разработчика фреймворка о том, насколько глубоким должен быть FIFO), подсистема быстрого ввода-вывода, проверки на соответствие, способы решения отставание и т. д. Короче говоря, это не позволяет вам уйти от ответственности, вы вынуждены учитывать все аспекты производительности вашей системы.
Это, конечно, сложнее, но в результате вы получите систему, которая определенно в порядке, а не сомнительное «может быть», которое у вас есть, если ваши очереди блокировки содержат неизвестное количество сообщений.
05.07.2013