我有一个产生进程的C ++程序。用户告诉我们需要处理多少个核心,以及他们想要运行多少个任务。
假设用户告诉我他们有8个内核可以使用,他们需要运行我们的20个任务。然后我最初生成8个任务,当每个任务完成时,我会生成一个新任务,直到我们完成20个任务。
我的程序适用于Windows(MSVC 11)和Linux(GCC 4.8),因此这些平台的实现方式不同,但总的来说,我使用信号量来跟踪生成的进程。
我的问题是:限制用户可以使用的核心数量的合理方法是什么?如果用户告诉我们一些不太可行的内核,我想在程序开始时出错。但我不确定如何获得具体数字,因为它取决于用户的机器和平台。
例如,我知道对于Windows,我使用WaitForMultipleObjects()
,所以我只限于MAXIMUM_WAIT_OBJECTS
=我可以等待的64个进程(参见here)。但Linux有什么类似的东西吗?甚至是Windows中的其他“陷阱”?
我想我正在寻找一些设定此限制的标准良好做法。
感谢。
答案 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个持久性线程正在从公共队列中读取。不需要编排。
我特别喜欢这个最后的解决方案,因为它涉及的平台特定代码要少得多。