【问题标题】:c pthreads: run at most 4 threads concurrently at any timec pthreads:任何时候最多同时运行4个线程
【发布时间】:2017-05-14 03:59:40
【问题描述】:

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

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

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 个线程,然后在完成后立即用新线程“替换”一个线程。

我该怎么做?

【问题讨论】:

    标签: c pthreads


    【解决方案1】:

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

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

    无论您选择什么数字(即线程数),您正在寻找的是thread pool。这个想法是创建固定数量的线程,并在它们完成后立即为它们提供工作。

    查看C: What's the way to make a poolthread with pthreads? 以获得简单的骨架。这个repo 还显示了一个独立的示例(如果要使用它,请检查许可证)。你可以在网上找到很多类似的例子。

    【讨论】:

      【解决方案2】:

      你要找的是semaphore;它将允许您限制一次只运行 4 个线程。你会/可以一开始就启动它们,当一个运行完成时,它会负责让一个新的继续。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-13
        • 1970-01-01
        • 1970-01-01
        • 2021-04-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多