我正在编写一个程序,其中有4个线程的范围。我正在使用 VC ++ 6.0 &不想只使用VC ++的任何库。 (根据规则)应根据核心数决定最佳线程数。
如何编写基于不同核心数创建不同线程数的代码???
我想按照下表
Cores | Threads
---------------
1 | 2
2 | 3
3+ | 4
有1个GUI& 3个工作线程。所有工作线程都使用循环缓冲区。我正在考虑如下实现3个工作线程。
对于每个单个输入文件,所有这3个步骤都是按顺序完成的。
将有大量文件需要处理(1000+)
我知道如何检测核心。如果那么其他方式也可以。但是,按照“if then else”方式管理代码似乎是一项艰巨的任务。
在这种情况下是否有任何标准的方法来管理代码。
答案 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
。
如果你能以某种方式描述你想做什么(也许作为一个简化的例子),它可以帮助你更好。也许有可能向您展示如何使工人设计符合您的目的。