В чем преимущество очереди сообщений перед общими данными при потоковой передаче?

Я читал статью о разработке многопоточных программ http://drdobbs.com/architecture-and-design/215900465 , там говорится, что это Лучшая практика, которая «заменяет общие данные асинхронными сообщениями. Насколько это возможно, предпочитайте держать данные каждого потока изолированными (не разделяемыми) и позволяйте потокам вместо этого общаться через асинхронные сообщения, которые передают копии данных ».

Меня смущает то, что я не вижу разницы между использованием общих данных и очереди сообщений. Сейчас я работаю над проектом без графического интерфейса для Windows, поэтому давайте использовать очереди сообщений Windows. и возьмем в качестве примера традиционную проблему производитель-потребитель.

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

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

ps. возможно, в очереди сообщений используется неблокирующий контейнер, но я мог бы использовать и параллельный контейнер и первым способом. Я хочу знать, как реализована очередь сообщений, и есть ли разница в производительности между двумя способами? Обновлено

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

6
задан Jason 19 August 2011 в 05:57
поделиться