[英]Limit or throttle running threads in C++ Linux
我正在使用 Pagmo,一个 C+ API 来解决我的优化问题。 当启动新的优化时,Pagmo 通过调用 island.evolve() 启动一个新线程。 我的观点是,我在这里对 Pagmo“幕后”启动的线程类型没有细粒度的控制。 我可以查询 Pagmo 线程的状态——关于它们是否已完成运行。 我有一台有 28 个物理内核的机器,我认为我正在运行的线程的最佳数量应该是 28 个。现在,我的代码只是将所有线程转储到机器上,这远远超过了核心数量 - 因此,效率可能非常低。 我正在考虑使用 std::counting_semaphore (C++ 20) 并将计数器设置为 28。每次我在 Pagmo 中启动一个线程时,我都会减少信号量计数器。 当它达到 0 时,其余线程将阻塞并在队列中等待,直到计数器递增。 我想我可以运行一个循环来查询 Pagmo 线程的状态,并在每次线程空闲时增加 std::counting_semaphore 的计数器(意味着它的任务已完成)。 当然,Pagmo 线程最终是加入的。 每次计数器超过 0 时,都允许启动一个新线程 - 我相信。 我的问题是:
我曾尝试过一个简单的循环来启动和限制广告的创建,但事实证明效果不佳,线程启动得太快。
首先,您的帖子可以进行一些编辑,甚至可以提供一个代码片段来帮助我们更好地理解问题。 现在我只是根据对你在那里做什么的疯狂猜测来浏览文档。
我已经快速检查了Pagmo
是关于什么的,我首先建议在从库外部限制任何为并行计算而设计的库时要小心。
我会尽量回答你的问题:
Pagmo
API 文档,如果我理解正确的话,你正在使用一个island
类——根据他们在文档中的声明,继承island
并由默认 ctor 构造的默认类是thread_island
(至少在非 POSIX 系统上——这可能不是你的情况)。 然而, thread_island
可以通过thread_island(bool use_pool)
ctor构造,这表明您可以为这些island
类指定一个它们可以使用的公共线程池。 如果它是针对非 POSIX 系统完成的,那么它很可能也适用于 POSIX 系统。 所以如果你想限制线程的数量,我会通过线程池来做到这一点。/proc/sys/kernel/threads-max
限制在 linux 上运行的最大线程数,您还可以通过niceness
指示 Linux 系统处理一些不太重要的进程希望能帮助到你!
编辑:作为脚注,我还要提到文档实际上鼓励使用thread_island
即使在 POSIX 系统上也是如此。 在此处查看此链接
EDIT2:如果由于无法保证thread_safety
时提到的问题而必须使用fork_island
。 那么另一种选择是通过setrlimit
限制可用资源,请在此处查看此链接- 您有兴趣设置RLIMIT_NPROC
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.