2013-01-02 33 views
0

我已经创建了一个模块来使用TCP客户端服务器通信使用多个套接字来传输数据。这将在10秒内传输20MB的文件。多级线程需要时间

多个套接字在每个单独的线程中发送/接收数据。

当我从另一个工作线程启动模块时,发送同一文件所用的时间增加到40秒。

请让我知道任何解决方案,以避免时间滞后。

+0

代码在哪里? – goji

+0

显示代码,指定您使用的线程库等等。最重要的是,我们在此讨论多少个线程?并运行多少CPU核心? – hyde

回答

0

您是否正在同步线程以从客户端的文件中读取内容并将其写回服务器端的文件?这增加了时间。

除此之外,默认情况下,您将在客户端和服务器上的多个线程之间切换上下文时间。

+0

从线程调用时,上下文切换花费的时间超过200毫秒。但是,当从主线程调用模块时,上下文切换最大为16毫秒。有没有什么办法可以减少这个时间? – d2h

0

一个问题可能是磁盘缓存和寻找。如果你还没有这样做,可以尝试更精细地交错由不同线程传输的块(比如,比如4KB,所以第一个线程传输字节0 ... 4095,第二个线程传输4096 ... 8191等)。

还可以避免互斥锁,例如让每个线程知道在线程启动时它应该读取和发送什么,或者写入和接收什么,所以不需要线程间通信。中止整个传输可以通过原子标志变量(在传输块之后由每个线程检查)而不是互斥体完成。

另外在接收端,请确保在内存中执行缓冲,以便顺序写入目标文件。也就是说,如果一个线程比其他线程更快地传输块,那么这些“早期”块将保存在内存中,直到所有前面的块都被接收和写入。

如果缓冲区大小成为问题,那么您可能需要在一端实现一些线程间同步(无关紧要,您是否减慢了接收或发送速度),以防止最快的线程太远前进最慢的线程,但对于数十兆字节的文件大小,在个人电脑上,这不应该成为一个问题。

+0

我正在使用每个线程将文件读入多个缓冲区。在接收端,数据再次保存在缓冲区中,以正确的顺序排序。 – d2h