使用多线程计算和

rap*_*yen 4 c multithreading pthreads

我正在开发一个程序,从文件中输入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;
}
Run Code Online (Sandbox Code Playgroud)

当我们讨论这一部分时,我似乎忘记了我在I/O上的可怕程度.使用给定参数测试程序(prob_5.c)的命令行参数是什么?

NPE*_*NPE 5

你的计划听起来不错 如果我是你,我会尝试执行它并在遇到任何特定问题时回来.

能够获得有关我应该启动和结束每个线程的代码的位置的反馈会很棒

你的主线程将创建工人.这将是您详细描述的循环的一部分.工人很可能会通过返回其线程函数来终止.

你不应该期待的一件事是加速.您的十个工作者版本很可能比其单线程版本慢.这与输入数组的小尺寸以及产生线程和后续同步的开销有关.此外,正如@Adam Rosenfield在评论中正确指出的那样,整个程序可能无论如何都是I/O绑定的.

  • @raphnguyen:这取决于.如果必须从物理硬盘驱动器(而不是缓存)读取数字,那么无论格式如何,让工作人员读取数字都不太可能提供任何加速.在任何情况下,我打赌这个练习是关于理解这些部分如何组合在一起,以及正确性.除非你的导师告诉你相反的情况,否则我不会担心表现(除此之外,或许,当你完成时测量它,以增强你自己的理解). (3认同)
  • 更不用说这个问题将受I/O限制:从文件中读取15,000个整数比将它们总结起来要长一个数量级,无论是单线程还是多线程. (2认同)