Windows 用于线程间通信的套接字

Windows Sockets for inter-thread communication

我有一个等待阻塞调用的线程(通过 select)并希望它同时与父线程通信。因为,当父级向它发送消息时它可能会参与阻塞调用,所以我不能使用 WaitForMultipleObjects。我想知道我是否可以在子线程和父线程之间使用套接字,但所有文献都表明套接字最好用于进程间而不是线程间通信。同时,我找不到它们可能不适合我的用例的原因。是否有任何我可能遗漏的东西,或者是否有针对此类用例的其他解决方案。 (寻找基于 C++ 的解决方案)

select 和 运行 循环设置超时,这样您就可以通过内存定期与父线程通信。

或者 运行 在单独的第三个线程中 select 并在第二个线程中使用 std::condition_variable 在循环或其他方式中使用超时等待它,同时也是能够与父线程通信。

wondering if I can use a socket between child and parent thread

是的。可以的。

but all literature suggests that sockets are best used for inter-process

选择在一个进程中使用多个线程而不是使用多个进程来实现应用程序的主要原因(也许是唯一原因)是线程可以通过共享内存相互通信。这可以简化应用程序的设计,因为不必对数据进行编组和通过管道发送,并在另一端取消编组。

I have a thread that waits on a blocking call (via select) and want it to communicate with the parent thread at the same time. Since, it can be involved in a blocking call when parent sends it a message, I cannot use WaitForMultipleObjects.

您不能使用 WaitForMultipleObjects() 等待 SOCKET 句柄。

但是,如果您使用 WSAEventSelect() 而不是 select() 来等待套接字操作,那么您可以使用 WaitForMultipleObjects()WSAWaitForMultipleEvents() 来等待套接字事件同时与其他 Win32 对象一起,如事件对象、管道等。

或者,如果您可以在线程之间使用 PostThreadMessage() 到 post 消息,则可以改用 MsgWaitForMultipleObjects()

否则,您只需在短时间内调用 select(),然后在调用 select().

之间根据需要检查您的线程间通信

I was wondering if I can use a socket between child and parent thread

从技术上讲是的,但这样做并不是很有用。线程之间有更有效的通信方式。

all literature suggests that sockets are best used for inter-process and not inter-thread communication.

没错。