2010-08-15 4 views
2

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

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

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

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

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

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

Спасибо

+4

Думаю, вам удастся получить ответ, если вы спросите более узкую версию этого вопроса. У вас есть несколько вопросов здесь, некоторые из них не связаны с другими ... Это очень разбросано. – SoapBox

ответ

3

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

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

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

+0

Потому что я уже использую boost asio, im используя boost asio io_service для выполнения асинхронных вызовов функций. Спасибо. – MiniScalope

2

Посмотрите на ICE messaging

Он поддерживает syncrhonous и asyncrounous обмен сообщениями между процессами, являются ли они на одном узле или нет.

Есть привязки для C++, Obj-C, Java, C#, Python, Ruby и PHP.