我正在编写的网络库需要通过TCP套接字发送和接收消息。可以随时发送或接收消息,即应作为全双工通道。
我能够使用两个线程来实现这样的场景:主线程调用send()和一个主要在recv()调用时阻塞的专用线程。
我的问题是:是否可以使用单个线程实现相同的方案?即通过注册一些回调函数?
作为旁注:我需要在C ++,Java和Python中实现这个场景。
答案 0 :(得分:4)
是的,有可能。您需要使用允许多路复用I / O的API。在C / C ++和Python下,您可以使用select()和非阻塞I / O,因此您阻止的唯一网络调用是select()。还有poll()和epoll()以及许多其他类似的API,它们可以实现相同的效果,具有不同程度的效率和可移植性。 Java也有non-blocking I/O APIs。
另一种可能性是使用异步I / O,您可以告诉操作系统启动I / O事务,并通知您(通过某种机制)何时完成操作。然而,我不熟悉那种网络编程风格,所以我不会试图提供细节。
答案 1 :(得分:0)
通常,库会通过在应用程序的主循环/事件循环中提供接口来实现此目的。
例如,大多数使用单线程网络的应用程序都会有一个主循环,阻塞select()
,poll()
或类似。您的库只返回应用程序应在其select()
/ poll()
调用中包含的文件描述符,以及应用程序在该文件描述符可读时应调用的回调函数。