4

我正在编写的网络库需要通过 TCP 套接字发送和接收消息。消息可以随时发送或接收,即应作为全双工通道工作。

我能够使用两个线程来实现这样的场景:调用 send() 的主线程和主要在 recv() 调用时阻塞的专用线程。

我的问题是:是否可以用单个线程实现相同的场景?即通过注册一些回调函数?

附带说明:我需要在 C++、Java 和 Python 中实现这个场景。

4

2 回答 2

4

是的,有可能。您需要使用允许多路复用 I/O 的 API。在 C/C++ 和 Python 下,您可以使用 select() 和非阻塞 I/O,因此您阻塞的唯一网络调用是 select()。还有 poll() 和 epoll() 以及许多其他类似的 API,它们完成相同的事情,具有不同程度的效率和可移植性。Java 也有非阻塞 I/O API

另一种可能性是使用异步 I/O,您告诉操作系统启动 I/O 事务,并在完成操作时通知您(通过某种机制)。但是,我不熟悉那种网络编程风格,所以我不会尝试提供细节。

于 2011-01-13T01:58:56.647 回答
0

通常,库会通过向应用程序的主循环/事件循环提供接口来做到这一点。

例如,大多数使用单线程网络的应用程序都会有一个阻塞 或类似的主select()循环poll()。您的库将只返回应用程序应包含在其select()/poll()调用中的文件描述符,以及应用程序应在该文件描述符可读时调用的回调函数。

于 2011-01-13T09:25:02.200 回答