我有一个线程等待阻塞调用(通过选择)并希望它同时与父线程通信。因为,当父母向它发送消息时,它可能参与阻塞调用,所以我不能使用 WaitForMultipleObjects。我想知道是否可以在子线程和父线程之间使用套接字,但所有文献都表明套接字最适合用于进程间而不是线程间通信。同时,我找不到它们可能不适合我的用例的原因。是否有任何我可能遗漏的东西,或者这种用例是否有其他解决方案。(寻找基于 c++ 的解决方案)
3 回答
想知道我是否可以在子线程和父线程之间使用套接字
是的。你可以。
但所有文献都表明套接字最好用于进程间
选择在一个进程中使用多个线程而不是使用多个进程来实现应用程序的主要原因(也许是唯一的原因)是线程可以通过共享内存相互通信。这可以简化应用程序的设计,因为不必对数据进行编组、通过管道发送以及在另一端取消编组。
我有一个线程等待阻塞调用(通过选择)并希望它同时与父线程通信。因为,当父母向它发送消息时,它可能参与阻塞调用,所以我不能使用 WaitForMultipleObjects。
您不能使用WaitForMultipleObjects()
等待SOCKET
句柄。
但是,如果您使用WSAEventSelect()
而不是select()
等待套接字操作,则可以同时使用WaitForMultipleObjects()
或WSAWaitForMultipleEvents()
等待套接字事件以及其他 Win32 对象,如事件对象、管道等。
或者,如果您可以使用PostThreadMessage()
在线程之间发布消息,则可以MsgWaitForMultipleObjects()
改为使用。
否则,您只需在select()
短暂的超时时间内调用,然后在调用select()
.
我想知道是否可以在子线程和父线程之间使用套接字
从技术上讲是的,但这样做并不是很有好处。线程之间有更有效的通信方式。
所有文献都表明套接字最好用于进程间而不是线程间通信。
那是对的。
设置超时select
并在循环中运行它,以便您可以通过内存定期与父线程通信。
或者在单独的第三个线程中运行选择,并在第二个线程中使用循环或其他方式超时等待它std::condition_variable
,同时还能够与父线程通信。