设置程序可以生成的进程数限制
Setting limit on number of processes my program can spawn
我有一个生成进程的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个持久线程正在从公共队列中读取。不需要编排。
我特别喜欢最后一个解决方案,因为它涉及的平台特定代码要少得多。
- IPC使用多个管道和分支进程来运行Python程序
- CoreCLR 中的检测探查器 - 将帮助程序程序集加载到 dotnet 进程的方法
- 每次使用带有LOCK_EX标志的LOCK_NB时,相同的程序/进程都会获取锁
- 如何保护非托管应用程序中的字符串不受进程转储的影响
- 在 Windows/C++ 上使用多进程应用程序的高精度定时操作
- 从Visual Studio 2017运行MPI应用程序,每个进程在不同的cmd窗口中
- 在程序继续C++时保持进程运行
- 64 位进程中的 AnyCPU C# DLL 无法引用 64 位C++ DLL(给出错误:无法加载文件或程序集)
- Qtwebengine进程在应用程序关闭后不会关闭
- 内核模式驱动程序可以在任何进程上执行读取进程内存吗?
- 与 Python 中子进程中的另一个应用程序的交互式会话
- FIFO块程序,直到其他进程读取
- C++程序将进程置于前台(如果已在运行),否则创建一个新进程
- Electron应用程序和Win32本机桌面应用程序之间的进程间通信
- gdb如何读取它正在调试的程序/进程的寄存器值?寄存器如何与进程相关联?
- 多次运行程序,同时保留一个进程
- 分叉程序在<defunct>一段时间后给出进程
- 从多个进程和同一进程中注册同一ETW TraceLogging提供程序GUID
- MPI在某个进程找到解决方案时使用广播结束程序
- 查找位置(寻找c++初学者)以创建Windows Vista x64 Ultimate的挂起进程程序