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

时间:2018-06-18 08:05:43

标签: c++ multithreading sockets synchronization winsockets

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

3 个答案:

答案 0 :(得分:1)

select设置超时并在循环中运行它,以便您可以定期通过内存与父线程进行通信。

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

答案 1 :(得分:1)

  

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

是。你可以。

  

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

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

答案 2 :(得分:1)

  

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

您无法使用WaitForMultipleObjects()等待SOCKET句柄。

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

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

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

  

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

技术上是的,但这样做并不是很有益。有更有效的方法在线程之间进行通信。

  

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

这是正确的。