Представьте, что вы управляете компанией, и вы могли бы нанять столько сотрудников, сколько вам было нужно, но каждый сотрудник был действительно целеустремлен, поэтому вы можете дать только один заказ . Вы не могли с ними справиться, верно? Поэтому, если бы вы были умным менеджером, то, что вы сделали бы, это сказать: «Ваш заказ», подождите от вашего почтового ящика, пока вы не получите письмо, в котором говорится, что делать, выполнять работу, а затем повторять ». Затем вы могли бы поместить рабочие элементы в папки входящих работников, поскольку вам нужна была проделанная работа.
Проблема в том, что произойдет, если вы дадите сотруднику долгосрочную задачу с низким приоритетом (скажем, «поехать в Топику, чтобы забрать арахисовое масло для пикника компании»). Сотрудник с радостью уйдет и сделает это. Но тогда здание загорается, и вам нужно знать, что если вы произведете заказ, «возьмите огнетушитель и выпустите огонь!» кто-то будет делать это быстро. Вы можете решить эту проблему, если у нескольких сотрудников есть один почтовый ящик. Таким образом, существует большая вероятность того, что кто-то будет готов выполнить заказ, чтобы окунуть пламя, и не уезжать через Канзас.
Угадайте, что? Темы - это трудные сотрудники.
Вы не передаете сообщения нитью.Что вы можете сделать, это настроить поток или группу потоков для наблюдения общей общей структуры данных, такой как блокирующая очередь (BlockingCollection в .NET, например), а затем помещать сообщения (например, ваши строки) в эту очередь для обработки по потребительским потокам (которые нужно прослушивать в очереди на работу).
Для двунаправленной связи вам понадобятся две очереди (одна для сообщения и одна для ответа). Причина в том, что ваш «основной» поток также является плохим сотрудником - он может обрабатывать ответы по одному за раз, а пока он обрабатывает ответ от одного работника, другой рабочий может вернуться с другим ответом. Вы хотите создать протокол координации запроса/ответа, чтобы исходный запросчик знал, к какому запросу относится ответ. Обычно запросы имеют идентификатор, а ответы ссылаются на идентификатор запроса, чтобы исходный запросчик знал, к какому запросу требуется каждый ответ ,
Наконец, вам нужна правильная синхронизация потоков (блокировка) в очередях, если она не встроена в очередь производителей/потребителей, с которой вы работаете. Представьте, что вы отправляли сообщение в папку «Входящие» рабочего, и этот рабочий так стремился прочитать сообщение, что он схватил его из вашей руки и разорвал его пополам. То, что вам нужно, - это возможность предотвратить одновременное обращение к очереди по нескольким потокам.
Посмотрите - http://ru.wikipedia.org/wiki/Producer-consumer_problem – adatapost