我正在讨论客户端应用程序中的多线程,并被告知使用单独的线程接收数据并使用另一个线程发送数据不是要走的路。
为什么?
据我所知,TCP 是全双工的,所以这是否会提高性能?
有一个专用的发送线程和一个专用的接收线程是不好的,原因有两个。
首先,这意味着每次从接收到发送都需要进行上下文切换,除非您同时进行这两项操作。
其次,这意味着在您接收查询、制定响应然后发送该响应的典型路径中,数据将需要从一个线程传递到另一个线程,从而耗尽缓存。
也就是说,如果性能不是超级关键并且它很适合您的设计,那么它肯定会起作用。只是通常没有优势。
我想这取决于您的应用程序的规模。如果你正在为一个班级项目做一个小应用程序,在同一个线程上发送和接收可能就足够了。然后您不必担心线程问题。
但是,我开发的应用程序必须侦听数千个传入连接,并且每个连接都可能发送大量数据。我们有一个线程,其唯一目的是侦听套接字连接并将新连接放入池中,以及可变数量的线程(取决于应用程序的繁忙程度)仅用于读取套接字,以及不同的线程池用于写作。
问题是,如果您的侦听套接字没有足够快地从线路中读取数据并且缓冲区已填满,则会返回错误,并且在数千个客户端的情况下,会导致大量重新连接和重新- 发送数据,这加剧了数据读取速度不够快的问题。
所以回到我一开始所说的——这取决于你的应用程序的规模,但为什么不现在添加能力呢?只要确保你是线程安全的,你应该没问题。