Межпотоковая связь (рабочие потоки) - PullRequest
1 голос
/ 28 июня 2010

Я создал два потока A & B, используя Windows API CreateThread.Я пытаюсь отправить данные из потока A в B.

Я знаю, что могу использовать объект Event и ждать объекта Event в другом, используя метод WaitForSingleObject.Все, что делает это событие, это просто сигнализирует поток.Это оно! Но как я могу отправить данные. Также я не хочу, чтобы нить B ожидала, пока нить не издаст сигналы.У него своя работа.Я не могу заставить его ждать.

Я не могу найти функцию Windows, которая позволила бы мне отправлять данные в / из рабочего потока и основного потока, ссылающихся на рабочий поток, либо по идентификатору потока, либо по возвращенномуСПРАВИТЬСЯ.Я не хочу вводить зависимость MFC в моем проекте и хотел бы услышать любые предложения относительно того, как другие будут или сделали в этой ситуации.Заранее спасибо за любую помощь!

Ответы [ 4 ]

4 голосов
/ 28 июня 2010

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

Что касается «отправки» данных из одного потока в другой, у вас есть несколько вариантов.Очереди сообщений Windows являются поточно-ориентированными, и у потока (даже если у него нет окна) может быть очередь сообщений, в которую можно отправлять сообщения, используя PostThreadMessage.

. Я также опубликовалкод для потокобезопасной очереди в другой ответ .

Поскольку поток продолжает выполняться, но учтите, что когда произошло изменение, типичным методом является его вызов WaitForSingleObject со значением тайм-аута 0, затем проверьте возвращаемое значение - если оно WAIT_OBJECT_0, событие (или что-то еще) было установлено, поэтому оно должно принять к сведению изменение.Если это WAIT_TIMEOUT, никаких изменений не произошло, и он может продолжить выполнение.В любом случае, WaitForSingleObject возвращается немедленно.

1 голос
/ 28 июня 2010

Поскольку два потока находятся в одном процессе (по крайней мере, так это звучит), нет необходимости «отправлять» данные. Они могут делиться этим (например, простая глобальная переменная). Вам необходимо синхронизировать доступ к нему через событие, семафор, мьютекс и т. Д.

В зависимости от того, что вы делаете, это может быть очень просто.

Thread1Func() {
  Set some global data
  Signal semaphore to indicate it is available
}

Thread2Func() {
  WaitForSingleObject to check/wait if data is available
  use the data
}
0 голосов
/ 30 июня 2010

Не используйте мьютексы, когда работаете только в одном процессе, поскольку у него больше накладных расходов (поскольку это общесистемный объект) ... Разместите критический раздел вокруг ваших данных и попробуйте ввести его (как Джерри Коффин сделал это в своем коде для потокаобезопасной очереди).

0 голосов
/ 28 июня 2010

Если вы озабочены минимизацией зависимостей Windows и предполагаете, что кодируете на C ++, я рекомендую использовать Boost.Threads, который является довольно приятным, Posix-подобным C ++-интерфейсом потоков. Это обеспечит вам простую переносимость между Windows и Linux.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...