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

时间:2013-01-20 12:56:31

标签: c++ multithreading visual-c++

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

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

我想按照下表

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

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

  1. 从文件中读取2.处理文件3.处理后创建新文件。
  2. 对于每个单个输入文件,所有这3个步骤都是按顺序完成的。

    将有大量文件需要处理(1000+)

    我知道如何检测核心。如果那么其他方式也可以。但是,按照“if then else”方式管理代码似乎是一项艰巨的任务。

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

3 个答案:

答案 0 :(得分:3)

您可以使用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

答案 1 :(得分:1)

目前,让我们忽略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;
};

然后从中获得三种不同的任务类型。然后你可能想要创建一个小的包装类,它掩盖了你正在处理指针以保持代码简单明了的事实。

答案 2 :(得分:0)

由于问题不是很具体,很难猜出你需要什么。

一般情况下,您可以创建执行某项工作的workers并通知您(通过回调或其他内容)有关结果的信息。

然后,每当您需要完成某项工作时,您就可以开始新的worker。最大数量为workers,具体取决于核心数量。有可能以某种方式将您想要执行的任务存储在队列中,并将它们提供给下一个空闲worker

如果你能以某种方式描述你想做什么(也许作为一个简化的例子),它可以帮助你更好。也许有可能向您展示如何使工人设计符合您的目的。