ожидание 2 разных событий в одном потоке - PullRequest
0 голосов
/ 14 мая 2010

УДАЛЕНО - причина: не очень нужно.

мои вопросы:

  • можно ли использовать linux UDP-сокет из двух разных потоков? ответ был здесь
  • У меня есть два разных события, которые я хотел бы подождать, используя только один поток. Одним из таких событий является добавление элемента в стек, а другим - доступность данных в сокете.
    Я могу использовать boost::condition_variable.wait(lock) для стека и boost::asio::io_service для сокета. Но нет механизма (который я знаю), который позволял бы мне ждать обоих событий одновременно (опрос исключен). Или это?
  • Есть ли какое-то другое альтернативное решение этой проблемы, о котором я не знаю? - Я сам это выясню.

Ответы [ 2 ]

1 голос
/ 14 мая 2010

Новый ответ

Но нет механизма (это я в курсе) что позволяет мне ждать оба события одновременно (опрос не может быть и речи). Или это?

Не то, чтобы я знал об этом, и не без опроса ... вам понадобится поток для ожидания каждого асинхронного события. Вы можете использовать блокирующий стек или, как вы сказали, использовать boost::condition_variable, который блокирует, пока в стеке не окажется что-то. boost::asio::io_service будет очень полезен для управления сокетами udp, но на самом деле он не дает никаких преимуществ, когда дело доходит до обработки событий.

Старый ответ

Я ДЕЙСТВИТЕЛЬНО не уверен, что ты пытаешься сделать ... то, что ты говоришь, не имеет особого смысла. Я сделаю все возможное, чтобы угадать, что вы пытаетесь сделать, но я бы предложил уточнить вопрос.


Вопрос:

Мне действительно нужно использовать основной поток для отправки данных через компонент розетка или я могу сделать это из новый поток? (Я думаю, что ответ нет, но я не уверен насчет условий гонки на розетках)

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


Вопрос:

как мне ждать обоих событий?

Ответ:

Вы не можете делать две вещи одновременно в одном и том же потоке ... при этом у вас есть два варианта:

  1. Постоянно опрашивать, чтобы увидеть, произошло ли какое-либо событие (в том же потоке).
  2. Имеют два потока, которые блокируют, пока не произойдет желаемое событие (обычно, когда вы читаете из сокета, оно блокируется, если нет данных).

Учитывая описание вашей проблемы, неясно, чего бы вы достигли, используя boost::condition_variable и / или boost::asio::io_service. Возможно, вы должны дать нам очень простой пример кода, которому мы можем следовать.


Вопрос:

Есть ли другая альтернатива Решение этой проблемы, что я не в курсе?

Ответ:
Там всегда есть альтернативные решения, но действительно трудно сказать, какие альтернативы могут быть даны текущее описание «проблемы». Я думаю, что вам следует снова отредактировать проблему и сосредоточиться на предоставлении очень конкретных примеров, возможно, некоторого псевдокода и т. Д.

0 голосов
/ 13 мая 2015

Переключитесь на Windows и используйте WaitForMultipleObjects или используйте эту функцию в Linux. Это очень удобно, и тогда вы можете делать две вещи в одном потоке.

...