c pthreads:随时同时运行最多4个线程

时间:2016-12-29 19:47:04

标签: c pthreads

我在C中有一个程序,它接受任意数量的文件作为命令行参数,并为每个文件计算sha1sum。我正在使用pthreads,这样我就可以利用所有4个核心。

目前,我的代码同时并行运行所有线程。 这是一个片段:

c = 0;
for (n = optind; n < argc; n++) {
    if (pthread_create(&t[c], NULL, &sha1sum, (void *) argv[n])) {
        fprintf(stderr, "Error creating thread\n");
        return 1;
    }
    c++;
}

c = 0;
for (n = optind; n < argc; n++) {
    pthread_join(t[c], NULL);
    c++;
}

显然,一次启动所有线程效率不高(或可扩展)。

确保只有4个线程在运行的最佳方法是什么?不知何故,我需要在开始时启动4个线程,然后&#34;替换&#34;一旦完成,就会有一个新的线程。

我该怎么做?

2 个答案:

答案 0 :(得分:2)

  

显然,一次启动所有线程效率不高(或可扩展)。

创建4个线程不一定能在4核机器上提供最佳性能。如果线程正在执行IO或等待某些事情,那么创建4个以上的线程也可以带来更好的性能/效率。你只需要根据你的线程所做的工作找出一个近似的数字,并且可能是一个迷你基准。

无论您选择什么号码(即线程数),您要找的是How to draw circle on the MAP using GMAP.NET in C#。我们的想法是创建固定数量的线程,并在完成后立即将它们提供给它们。

有关简单的骨架,请参阅thread pool。此C: What's the way to make a poolthread with pthreads?还显示了一个自包含的示例(如果您要使用它,请检查许可证)。你可以在网上找到很多类似的例子。

答案 1 :(得分:0)

你要找的东西是semaphore;它允许您一次只限制4个线程运行。你可以/最初可以启动它们,并且当一个正在运行的一个完成时,它将负责让一个新的进行。