设置我的程序可以生成的进程数限制

时间:2015-02-10 18:38:46

标签: c++ multithreading

我有一个产生进程的C ++程序。用户告诉我们需要处理多少个核心,以及他们想要运行多少个任务。

假设用户告诉我他们有8个内核可以使用,他们需要运行我们的20个任务。然后我最初生成8个任务,当每个任务完成时,我会生成一个新任务,直到我们完成20个任务。

我的程序适用于Windows(MSVC 11)和Linux(GCC 4.8),因此这些平台的实现方式不同,但总的来说,我使用信号量来跟踪生成的进程。

我的问题是:限制用户可以使用的核心数量的合理方法是什么?如果用户告诉我们一些不太可行的内核,我想在程序开始时出错。但我不确定如何获得具体数字,因为它取决于用户的机器和平台。

例如,我知道对于Windows,我使用WaitForMultipleObjects(),所以我只限于MAXIMUM_WAIT_OBJECTS =我可以等待的64个进程(参见here)。但Linux有什么类似的东西吗?甚至是Windows中的其他“陷阱”?

我想我正在寻找一些设定此限制的标准良好做法。

感谢。

1 个答案:

答案 0 :(得分:0)

WaitForMultipleObjects很不错,但这不是唯一的办法。还有其他等待多个线程或进程的方法。例如,您可以将任务包装在执行任务的线程中,然后将结果(或仅通知)放在队列上并跳转常见的手动重置事件。产卵过程等待手动重置事件,当它跳闸时,清空队列。这样您就不会等待多个事件,并且可以拥有无​​限数量的并发任务(当然,这与硬件限制一致)。

这假设您有一个可以用作队列的线程安全队列或列表。

根据应用程序的确切功能,您还可以对其进行重组,以便创建N个线程(N是要使用的核心数),每个线程从公共队列中一次删除一个任务。它会是这样的:

QueueOfTasks  // at global scope

// each thread proc
while (Queue of tasks is not empty)
{
    Dequeue task
    Execute task
    Do whatever post-task processing is necessary
}

在那里,你不需要任何等待句柄。您有N个持久性线程正在从公共队列中读取。不需要编排。

我特别喜欢这个最后的解决方案,因为它涉及的平台特定代码要少得多。