2个线程(套接字线程和主线程)之间最有效的Inter通信是什么?

时间:2015-02-27 16:34:26

标签: multithreading performance sockets communication postmessage

我们通过使用与WSARecvFrom()和IoCompletionPort的异步IO,从多个套接字读取数据。

主线程应处理收到的数据(数据包大小约为1500字节)。主线程也处理所有其他同步内容。

如果主线程与一个Window关联,我们使用PostMessage()向该窗口发送一条消息,它会花费很长时间,直到主窗口线程通过GetMessage()获取消息并且可以处理数据。如果我们应该处理大量网络消息,则此方法不可用。

主线程中的Socket Thread和GetMessage()中的PostThreadMessage()会有更好的性能吗?

主线程中的Socket Thread和WaitForMultipleObjects()中的SetEvent()会有更好的性能吗?

是否有更有效的方式来表示数据到达主线程?

是否有任何Win32同步函数也可以直接发送主线程要处理的数据而没有信号量保护的应用程序缓冲区?

1 个答案:

答案 0 :(得分:0)

基本上,没有。没有比PostMessage(),PostThreadMessage(),QueueUserAPC等线程间通信调用更快的机制。

此类调用传输缓冲区指针或“this”实例指针所花费的时间通常会被将此类数据呈现到GUI组件所需的大量时间所淹没。

如果你用一堆非GUI活动加载你的主线程,阻止了对消息的快速处理,或者你发布消息的速度比GUI线程可以合理地消耗它们的速度快,那么你就有一个大问题。 / p>

如果PostMessage()的延迟实际上是问题的根本原因(我怀疑),那么您可以将缓冲区聚合到容器对象和PostMessage中,从而改善已发布消息的总带宽

  

将Socket Thread和WaitForMultipleObjects()中的SetEvent()放入   主线程有更好的性能吗?

我怀疑不是很明显。它必须是WaitForMultipleObjects(Ex),才能处理'普通'GUI消息以及你的东西。如果根本原因是由于其他原因而重载的主线程,或者如果消息的发布速度超过您处理它们的速度,则无效。