2012-04-18 23 views
2

我有更多的概念问题。 假设一个程序运行两个线程。 两个线程始终都在运行循环。 一个线程负责流式传输数据,另一个线程负责接收第一个线程必须传输的文件。 因此,文件传输线程是循环接收它写入文件的数据,并且流式处理线程从该文件读取数据,并根据需要进行流式处理。如何优化运行重循环的两个线程

我在这里看到的问题是如何避免在文件传输占用太多CPU周期的情况下自己停止饥饿,从而使流线程滞后?

我知道流式传输数据的速度远远低于文件传输接收数据的速度,我将如何在这两个线程之间有效共享CPU。

我感谢您的建议。

+0

你为什么要通过文件进行通信?为什么不使用'pipe()'? – chrisaycock 2012-04-18 13:20:19

+0

由于接收到的数据可能需要在稍后再次流式传输,这意味着新的文件传输。这样,文件只传输一次,因为它已经存在。 – gekod 2012-04-18 13:22:29

+0

我们在这里谈论的数据量是多少?这是你可以存储在内存中的东西吗? – chrisaycock 2012-04-18 13:26:54

回答

2

常常这样那样的问题,通过使用流量控制somekind的解决:

阻止发件人时接收器很忙。

这个原因还有问题:如果你的程序必须能够快进(前进), 那么这不是个好主意。

对于您的情况,当文件中存在大于2MB的未精简数据时,可以阻止文件传输线程。当数据少于1MB时恢复。

0

看看pthread_setschedparam()帮助你平衡了线程的使用的CPU

的从pthread_setschedparamman page,您可以更改线程优先级。

pthread_setschedparam(pthread_t thread, int policy, 
         const struct sched_param *param); 

     struct sched_param { 
      int sched_priority;  /* Scheduling priority */ 
     }; 

    As can be seen, only one scheduling parameter is supported. For details of 
    the permitted ranges for scheduling priorities in each scheduling policy, see 
    sched_setscheduler(2). 

此外,

文件传输正在采取太多的CPU周期,它自己的

如果你读这SO post,这似乎表明,改变线程的优先级可能无法帮助。因为文件传输线程消耗更多CPU周期的原因是它需要它。但在你的情况下,如果文件传输速度减慢,那么你确定没问题,因为流式线程无法与之竞争!因此,我建议您更改优先级和剥夺一些周期的文件传输线程即使需要它