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

Setting limit on number of processes my program can spawn

本文关键字:进程 程序 设置      更新时间:2023-10-16

我有一个生成进程的C++程序。用户告诉我们必须使用多少内核,以及他们希望运行多少任务。

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

我的程序在Windows(MSVC 11)和Linux(GCC 4.8)上运行,因此这些平台的实现不同,但总的来说,我使用信号量来跟踪派生的进程。

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

例如,我知道对于Windows,我使用WaitForMultipleObjects(),因此我只能等待MAXIMUM_WAIT_OBJECTS=64个进程(请参阅此处)。但是Linux有这样的东西吗?甚至是Windows中的其他类似"gotchas"?

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

谢谢。

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个持久线程正在从公共队列中读取。不需要编排。

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