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

Posted

技术标签:

【中文标题】用于线程间通信的 Windows 套接字【英文标题】:Windows Sockets for inter-thread communication 【发布时间】:2018-06-18 08:05:42 【问题描述】:

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

【问题讨论】:

您是否尝试过使用std::condition_variable 等待,以便在需要时从父线程中唤醒线程? 就父级而言,等待选择的线程不会处于休眠状态,所以我怀疑它是否会起作用。不过感谢您的建议! 【参考方案1】:

我有一个线程等待阻塞调用(通过选择)并希望它同时与父线程通信。因为,当父母向它发送消息时,它可能参与阻塞调用,所以我不能使用 WaitForMultipleObjects。

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

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

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

否则,您只需在短暂的超时后调用select(),然后在调用select() 之间根据需要检查您的线程间通信。

我想知道是否可以在子线程和父线程之间使用套接字

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

所有文献都表明套接字最适合用于进程间通信,而不是线程间通信。

没错。

【讨论】:

【参考方案2】:

select 设置一个超时时间并在循环中运行它,这样您就可以通过内存定期与父线程通信。

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

【讨论】:

【参考方案3】:

想知道我是否可以在子线程和父线程之间使用套接字

是的。可以的。

但所有文献都表明套接字最适合用于进程间

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

【讨论】:

P.S.,我对WinAPI线程了解不多,但是在很多线程系统中,线程之间是没有父子关系的。 将它们视为父母和孩子可能会有所帮助,但线程库本身可能并不关心哪个创建了另一个。

以上是关于用于线程间通信的 Windows 套接字的主要内容,如果未能解决你的问题,请参考以下文章

进程间的几种通信方式的比较和线程间的几种

进程间通信方式及特点

进程通信,线程通信,同步方式

异步线程间通信

java线程间通信1--简单实例

进程间通信与线程间通信