асинхронная межпотоковая связь - PullRequest
2 голосов
/ 15 августа 2010

Я делаю кросс-платформенную программу, которая встраивает небольшой RARP-сервер (реализован с помощью winpcap / pcap) и запускает 2 TCP IP-сервера. Я должен использовать C ++.

Таким образом, у меня будет по крайней мере 4 потока, основной из которых имеет контроллер, 2 асинхронных сокета TCP / IP и сервер RARP.

Я планировал использовать c ++ BOOST Asio и Thread, потому что мне нужно запустить эту программу в Linux и Windows XP. (и я не могу использовать Qt)

Я бы выполнил асинхронную связь между потоками.

Для примеров пожаров внутри цикла без блокировки цикла

Как я могу это сделать? С портативным библиотекарем желательно.

Спасибо

Ответы [ 2 ]

3 голосов
/ 15 августа 2010

Для этого нет универсального решения, вы не можете просто прервать поток и доставить уведомление для обработки. Это вызывает ужасные проблемы повторного входа и большие порции тупиковой ситуации. Уведомление может быть обработано только тогда, когда поток находится в состоянии покоя.

Операционная система обычно имеет службы, которые делают это возможным. В Windows это обычно делается путем отправки сообщения в очередь сообщений. Прочитано в цикле сообщений, который является состоянием «ожидания» для потока пользовательского интерфейса. Или используя асинхронные вызовы процедур, запускаемые при блокировке потока и явно разрешающие запуск APC.

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

2 голосов
/ 15 августа 2010

Взгляните на Обмен сообщениями ICE

Он поддерживает синхронный и асинхронный обмен сообщениями между процессами независимо от того, находятся они на одном узле или нет.

Для C ++ существуют привязки, Obj-C, Java, C #, Python, Ruby и PHP.

...