2012-04-18 21 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週期的原因是它需要它。但在你的情況下,如果文件傳輸速度減慢,那麼你確定沒問題,因爲流式線程無法與之競爭!因此,我建議您更改優先級和剝奪一些週期的文件傳輸線程即使需要它