簡體   English   中英

使用多線程計算和

[英]Computing Sums Using Multithreading

我正在開發一個程序,從文件中輸入15,000個整數。 在讀取值之后,線程應該創建10個線程,每個線程負責計算其塊的總和(每個1,500個值)。 然后每個線程將打印其值的總和,主線程將計算所有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)的命令行參數是什么?

你的計划聽起來不錯 如果我是你,我會嘗試執行它,如果遇到任何問題,請回過頭來解決具體問題。

能夠獲得有關我應該啟動和結束每個線程的代碼的位置的反饋會很棒

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

你不應該期待的一件事是加速。 您的十個工作者版本很可能比其單線程版本慢。 這與輸入數組的小尺寸以及產生線程和后續同步的開銷有關。 此外,正如@Adam Rosenfield在評論中正確指出的那樣,整個程序可能無論如何都是I / O綁定的。

有些事情要考慮:

1)您的主線程如何知道求和操作是否完整以及所有同時運行的線程中的數據是否可用? 對於某些設計,包括你的設計,你開始的最后一個線程可能不是最后完成的。

2)你怎么能花時間看看是否有加速? 有15000個整數,秒表不是任何用途!

3)你可能想提一下,如果這個求和操作可能被用作更大的應用程序的一部分並且將被多次運行(或者在多個輸入文件上同時運行),那么在啟動時創建10個線程並擁有它們等待生產者 - 消費者隊列上的求和,(因此創建一個線程池),將通過消除連續的線程創建/終止來提高整體性能。 你也可以匯集一些IntBlocks,但這里的優化沒有多大意義,因為:

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

5)當你完成你的家庭作業應用程序時,看看它如何與SSD一起表現可能會很有趣 - 也許你可以讓你的導師/教授為你買一個

Rgds,馬丁

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM