接收/发送单线程或单独的线程?

时间:2013-03-21 13:31:29

标签: c++ tcp zeromq

我正在讨论客户端应用程序中的多线程,并被告知使用单独的线程接收数据而另一个线程用于发送数据是不可取的。

为什么?

据我所知,TCP是全双工的,所以这会改善性能吗?

2 个答案:

答案 0 :(得分:6)

拥有专用的发送线程和专用的接收线程有两个原因。

首先,这意味着每次从接收到发送都需要进行上下文切换,除非您同时进行两者。

其次,这意味着在您收到查询的典型路径中,制定响应,然后发送该响应,数据将需要从一个线程传递到另一个线程,吹灭缓存。

也就是说,如果性能不是超级关键并且它很适合您的设计,它肯定有效。只是通常没有优势。

答案 1 :(得分:2)

我认为这取决于您的应用程序的规模。如果你正在为一个类项目做一个小应用程序,那么在同一个线程上发送和接收就足够了。然后你不必担心线程问题。

但是,我在一个应用程序上工作,该应用程序必须监听数千个传入连接,并且每个连接可能正在发送大量数据。我们有一个线程,其唯一目的是监听套接字连接并将新连接放入池中,并且可变数量的线程(取决于应用程序的繁忙程度)仅用于读取套接字,以及不同的线程池用于写入。

问题是如果你的监听套接字没有足够快地读取数据并且缓冲区填满,则会返回错误,并且在数千个客户端的情况下,会导致很多重新连接和重新发送数据,这首先加剧了数据读取速度不足的问题。

所以它回到我刚才所说的 - 它取决于你的应用程序的规模,但为什么不立即增加能力?只要确保你是线程安全的,你应该没问题。