繁体   English   中英

为可变数量的内核编写多线程程序

[英]writing multithread program for variable number of cores

我正在编写一个程序,其中有4个线程的作用域。 我正在使用VC ++ 6.0 ,并且不想只使用VC ++的任何库。 (根据规则)最佳线程数应根据核心数确定。

如何编写基于不同内核数创建不同线程数的代码?

我想遵循下表

Cores | Threads
---------------
   1  |  2 
   2  |  3
   3+ |  4

有1个GUI和3个工作线程。 所有工作线程都使用循环缓冲区。 我正在考虑实现以下3个工作线程。

  1. 从文件读取2.处理文件3.处理后创建一个新文件。

对于每个单个输入文件,依次执行所有这三个步骤。

将有大量文件需要处理(超过1000个)

我知道如何检测核心。 如果还有其他方式也可以。 但是,按照“如果不是这样”的方式管理代码似乎将是一项艰巨的任务。

在这种情况下,是否有任何标准的方法来管理代码。

您可以使用std :: hardware_concurrency

#include <iostream>
#include <thread>

int main() {

  std::cout << "Number of available cores on this system (hint): " 
            << std::thread::hardware_concurrency() << "\n";

}

然后启动适当数量的std :: threads

目前,让我们忽略GUI线程,因为它总是一样的。

对于辅助线程,您基本上要创建与核心相同数量的线程,最多三个,因此您需要执行以下操作:

HANDLE worker_threads[3];
int num_threads = min(num_cores, 3);

for (int i=0; i<num_threads; i++)
    worker_threads[i] = CreateThread(...);

现在,关于如何使用这些线程:简短的答案是,我不会按照您在问题中所描述的那样进行操作。 采取需要按顺序执行的三个步骤并在线程之间将它们分解是没有意义的。 实际上,我完全避免将线程专用于特定类型的任务。

相反,我将使线程保持通用,以便每个线程都可以执行三个任务中的任何一个。 使用要执行的任务队列。 线程只是从队列中检索任务并执行它们。 如果该任务导致要执行另一个任务,则该任务将与其余任务一起放回到队列中。

由于您使用C ++进行此操作,因此一种明显的实现方式是为所有任务创建基类:

class Task {
public:
    virtual int operator()() = 0;
};

然后从中派生三种不同的任务类型。 然后,您可能需要创建一个小的包装器类,以掩盖您正在处理指针以使代码简单明了的事实。

由于问题不是很具体,因此很难猜测您需要什么。

通常,您可以创建可以完成特定工作的工作workers ,并(通过回调或其他方式)将结果通知您。

然后,每当您需要做某事时,您就可以开始新worker 取决于核心数,可以有最大数量的workers 可以以某种方式将您要执行的任务存储在队列中,然后将其交给下一个免费worker

如果您能以某种方式描述您想做的事情(也许是一个简化的示例),则可能会更好地帮助您。 也许可以向您展示如何使工人设计适合您的目的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM