Как я могу передать данные из потока в родительский процесс? - PullRequest
1 голос
/ 10 июня 2009

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

Мне нужно сообщить основному процессу, что что-то находится в очереди. Затем он может получить доступ к очереди и обработать объекты. Поток не может обработать эти объекты, потому что библиотека может быть вызвана только одним процессом.

Я думаю, мне нужно использовать каналы и сигналы. Я также читал из разных новостных групп, что мне нужно использовать самофокус.

Как следует реализовать этот сценарий?

Более конкретный случай следующего поста:

Как можно использовать трубы unix между основным процессом и резьбой?

Ответы [ 3 ]

2 голосов
/ 10 июня 2009

Почему бы не использовать простой FIFO (именованный канал)? Основной процесс будет автоматически блокироваться, пока он не сможет что-то прочитать.
Если он не должен блокироваться, вместо этого должна быть возможность опроса, но, возможно, он будет загружать процессор Вероятно, для этого существует эффективная библиотека.

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

  • Маска всех сигналов в каждом потоке,
  • Специальный поток обрабатывает сигналы с sigwait(). Возможно, придется разбудить другой поток, который будет обрабатывать сигнал, например, используя условные переменные.

Преимущество заключается в том, что вам больше не нужно беспокоиться о том, какую функцию безопасно вызывать из обработчика.

0 голосов
/ 10 июня 2009

«Оптимальное» решение во многом зависит от вашей конкретной установки. У вас есть один процесс с основным потоком и дочерним потоком или у вас есть один родительский процесс и дочерний процесс? Какую ОС и какую библиотеку потоков вы используете?

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

В частности, C ++ не имеет понятия о потоках в своей модели памяти и не имеет понятия атомарных операций, синхронизации, упорядоченного доступа к памяти, условий гонки и т. Д.

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

0 голосов
/ 10 июня 2009

Я настоятельно рекомендую вам использовать потокобезопасную очередь, такую ​​как эта (статья и исходный код). Я лично использовал это, и это очень просто в использовании. API состоит из простых методов, таких как push (), try_pop (), wait_and_pop () и empty ().

Обратите внимание, что он основан на Boost.Thread .

...