我正在开发一个程序,它从文件中输入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)的命令行参数是什么?
答案 0 :(得分:5)
你的计划听起来不错。如果我是你,我会尝试执行它,如果遇到任何问题,请回过头来解决具体问题。
获得有关我应该在代码中的位置的反馈会很棒 启动和结束每个线程
您的主要线程将创建工作人员。这将是您详细描述的循环的一部分。工人很可能会通过从他们的线程函数返回来终止。
你不应该期待的一件事是加速。您的十个工作者版本很可能比其单线程版本慢。这与输入数组的小尺寸以及产生线程和后续同步的开销有关。此外,正如@Adam Rosenfield在评论中正确指出的那样,总体程序可能会受到I / O限制。
答案 1 :(得分:0)
要考虑的一些事情:
1)您的主线程如何知道求和操作已完成,并且所有并发运行的线程都可以获得数据?对于某些设计,包括你的设计,你开始的最后一个线程可能不是最后完成的。
2)你怎么能花时间看看是否有加速?有15000个整数,秒表不是任何用途!
3)你可能要提一下,如果这个求和操作很可能被用作一个更大的应用程序的一部分并且将被多次运行(或者在多个输入文件上同时运行),那么在启动时创建10个线程并让他们等待生产者 - 消费者队列上的求和,(因此创建一个线程池),将通过消除连续的线程创建/终止来提高整体性能。你也可以集中一些IntBlocks,但这里的优化没有多大意义,因为:
4)如前所述,15000个整数数据并不多,求和是一个快速的操作,所以请注意其他海报关于慢速磁盘I / O等的警告。
5)当你准备好你的家庭作业应用程序时,看看它如何与SSD一起表现可能会很有趣 - 也许你可以让你的导师/教授为你买一个
RGDS, 马丁