0

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

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

我想按照下表

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

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

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

对于每个单个输入文件,所有这 3 个步骤都是按顺序完成的。

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

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

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

4

3 回答 3

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

于 2013-01-20T13:12:21.083 回答
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;
};

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

于 2013-01-20T18:06:54.427 回答
0

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

一般来说,您可以创建workers执行某项工作的程序并通知您(通过回调或其他方式)结果。

worker然后,每次你需要做一些事情时,你就开始一个新的。可能有一个最大数量,workers具体取决于内核的数量。有可能以某种方式将您想要执行的任务存储在队列中并将它们交给下一个 free worker

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

于 2013-01-20T13:12:51.440 回答