Windows Sockets для связи между потоками

У меня есть поток, который ожидает блокирующего вызова (через select) и хочет, чтобы он одновременно общался с родительским потоком. Так как он может быть вовлечен в блокирующий вызов, когда родитель отправляет ему сообщение, я не могу использовать WaitForMultipleObjects. Мне было интересно, могу ли я использовать сокет между дочерним и родительским потоком, но вся литература предполагает, что сокеты лучше всего использовать для межпроцессного, а не межпоточного взаимодействия. В то же время я не нахожу причину того, что они могут не соответствовать моему варианту использования. Могу ли я что-то упустить или есть другое решение для такого варианта использования. (В поисках решения на основе c ++)

0

Решение

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

Вы не можете использовать WaitForMultipleObjects() ждать на SOCKET справиться.

Однако, если вы используете WSAEventSelect() вместо select() чтобы ждать операции сокета, вы можете использовать WaitForMultipleObjects() или же WSAWaitForMultipleEvents() ожидать события сокета одновременно с другими объектами Win32, такими как объекты событий, каналы и т. д.

Или, если вы можете использовать PostThreadMessage() для размещения сообщений между темами, вы можете использовать MsgWaitForMultipleObjects() вместо.

В противном случае вам просто нужно будет позвонить select() с коротким таймаутом, а затем проверяйте свои межпотоковые связи по мере необходимости между вызовами select(),

Мне было интересно, могу ли я использовать сокет между дочерним и родительским потоком

Технически да, но это не очень выгодно. Есть более эффективные способы общения между потоками.

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

Это правильно.

1

Другие решения

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

Или запустите select в отдельном третьем потоке и дождитесь его во втором потоке, используя std::condition_variable с таймаутом в цикле или другими средствами, а также возможность связи с родительским потоком.

1

интересно, могу ли я использовать сокет между дочерним и родительским потоком

Да. Вы можете.

но вся литература предполагает, что сокеты лучше всего использовать для межпроцессных

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

1
По вопросам рекламы [email protected]