Я прочитал статью о дизайне многопоточной программы http://drdobbs.com/architecture-and-design/215900465,, в которой говорится, что рекомендуется "заменять общие данные асинхронными сообщениями. По мере возможности предпочитать сохранять данные каждого потока изолированными (неразделенными) ивместо этого потоки взаимодействуют через асинхронные сообщения, которые передают копии данных ".
Что меня смущает, так это то, что я не вижу разницы между использованием общих данных и очередей сообщений.Сейчас я работаю над не-графическим проектом для Windows, поэтому давайте использовать очереди сообщений Windows.и возьмем в качестве примера традиционную проблему производитель-потребитель.
Используя совместно используемые данные, будет общий контейнер и блокировка, защищающая контейнер между потоком производителя и потоком потребителя.когда производитель выводит продукт, он сначала ждет блокировки, а затем что-то записывает в контейнер, а затем снимает блокировку.
Используя очередь сообщений, производитель может просто PostThreadMessage без блока.и это преимущество асинхронного сообщения.но я думаю, что должна существовать некоторая блокировка, защищающая очередь сообщений между двумя потоками, в противном случае данные будут определенно повреждены.вызов PostThreadMessage просто скрыть детали.Я не знаю, верна ли моя догадка, но если она верна, то, кажется, преимущество больше не существует, поскольку оба метода делают одно и то же, и единственное отличие состоит в том, что система скрывает детали при использовании очередей сообщений.1010 * пс.возможно, в очереди сообщений используется неблокирующий контейнер, но я мог бы также использовать параллельный контейнер и в предыдущем случае.Я хочу знать, как реализована очередь сообщений, и есть ли разница в производительности между этими двумя способами?
обновлено: я все еще не понимаю концепцию асинхронного сообщения, если операции очереди сообщений все еще заблокированы где-то еще,Поправьте меня, если мое предположение было неверным: когда мы используем общие контейнеры и блокировки, мы будем блокировать в нашем собственном потоке.но при использовании очередей сообщений мой поток немедленно вернулся и оставил работу по блокировке некоторому системному потоку.