2011-09-15 104 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