2011-09-15 108 views
4

我正在從一個文件中獲取15,000個整數的輸入的程序。在讀取值之後,線程應該創建10個線程,每個線程負責計算塊的總和(每個值爲1500)。然後每個線程將打印其值的總和,並且主線程將計算來自所有10個線程的總和。使用多線程計算總和

我的心是讀取所有值並將它們存儲在一個int數組中,同時使用int來保持讀取的值的數量的計數(我們稱之爲int值)。然後我將這個數除以線程數,我想確定每個線程應該有的每塊數值(我們稱它爲int塊)。然後,我將啓動一個線程,在增加數組索引計數的同時循環訪問數組(int block times),然後只要數組索引計數不等於最後一個數組索引,就啓動一個新線程。

這是看這個問題的正確方法嗎?有一個更簡單的方法嗎?我們已經給出了使用pthread_create,pthread_join,pthread_exit,pthread_attr_init,pthread_attr_destroy和pthread_setdetachstate的提示。這是我第一次嘗試多線程,所以能夠獲得關於我應該在哪些代碼中啓動並結束每個線程的反饋非常好,以便它實際上是多線程並且不會多次執行單個線程。任何幫助將不勝感激!

編輯:命令行參數卡住

#include <stdio.h> 

int main(int argc, char *argv[]) { 
int i; 
FILE *fp; 
int c; 

for (i = 1; i < argc; i++) { 
    fp = fopen(argv[i], "r"); 

    if (fp == NULL) { 
     fprint(stderr, "cat: can't open %s\n", argv[i]); 
     continue; 
    } 

    while ((c = getc(fp)) != EOF) { 
     putchar(c); 
    } 

    fclose(fp); 
} 

return 0; 
} 

我似乎已經忘記了我是多麼可怕的是在I/O時,我們討論了這一節。什麼是用給定參數測試我的程序(prob_5.c)的命令行參數?

回答

5

你的計劃聽起來不錯。如果我是你,我會嘗試執行它,如果遇到任何問題,請回到特定的問題。

這將是巨大的得到凡在我的代碼,我應該 開始反饋和結束每一個線程

你的主線程將創建工人。這將是你詳細描述的循環的一部分。很可能工人們將通過從他們的線程函數返回來終止。

你不應該期待的一件事就是加速。很可能你的十個工作者的版本會比它的單線程等價物慢。這與輸入數組的小尺寸以及產卵線程和隨後的同步的開銷有關。此外,正如@Adam Rosenfield在評論中正確指出的那樣,總體計劃無論如何都可能是I/O綁定的。

+2

且不說,這個問題將是I/O密集型:閱讀在15,0 00整數從一個文件開始要比總結長一個數量級,不管它是單線程的還是多線程的。 –

+0

最後一段的+1。在現實世界中,創建一個線程需要大約相同的時間總計15000個整數。並且請注意,如果您將讀取整數並將它們的十進制表示法轉換爲二進制文件的工作,則可能會得到顯着的加速。 –

+0

我可能會嘗試將讀整數的工作拆分爲額外的功勞。如果我將讀數分開,我仍然可以獲得任何速度增加,但將整數保留爲小數形式,或者只有在將其轉換爲二進制形式時纔會看到速度增加。 – raphnguyen

0

有些事情要考慮:

1)如何將你的主線程知道求和操作完成,數據可以從所有的併發運行的線程?有了一些設計,包括你的設計,你開始的最後一個線程可能不是最後一個完成的線程。

2)您可能會如何計時以查看是否有加速?有15000個整數,秒錶不會被用作任何用途!3)你可能想提一下,如果這個求和操作可能被用作一個更大的應用程序的一部分,並且將被運行多次(或者同時運行多個輸入文件),那麼在10個線程中創建10個線程啓動並讓它們等待生產者 - 消費者隊列上的求和請求(因此創建線程池),將通過消除連續的線程創建/終止來提高整體性能。你也可以聚集一些IntBlocks,但是這裏沒有太多的優化點,因爲:

4)如前所述,15000整數不是很多數據,求和是一個快速操作,所以注意警告從其他海報關於慢速磁盤I/O等

5)當你的作業應用程序正在進行,它可能會很有趣,看看它如何執行一個SSD - 也許你可以讓你的導師/教授買你一個

RGDS, 馬丁

+0

謝謝馬丁!在我完成練習時,我會牢記這些。也許我的導師/教授可以給我買SSD嗎?我想去任何你去過的大學! – raphnguyen

+0

給教授的提示:如果可以,並且這個傢伙/加侖可以讓他/她的作業應用程序運行並輸出時間,請讓他/她訪問帶有SSD和多個核心的盒子以進行比較測量,[Martin James,三十年來開發多線程應用程序]。 –

+0

我希望我的教授能看到這個!我希望你能把你的多線程知識帶到這裏:http://stackoverflow.com/questions/7438697/multithreading-when-to-start-and-exit-threads – raphnguyen