一旦另一个线程完成,就会生成一个新线程
Spawn a new thread as soon as another has finished
我有一个昂贵的函数,需要执行 1000 次。执行可能需要 5 秒到 10 分钟。因此,它具有很高的变化。我喜欢有多个线程在上面工作。我目前的实现在 4 次 250 次调用中设计了这 1000 次调用,并生成了 4 个线程。但是,如果一个线程有"糟糕的一天",则与其他 3 个线程相比,它有更长的时间来完成。
因此,每当线程完成上一个调用时,我喜欢对该函数进行新的调用 - 直到所有 1000 次调用都完成。
我认为线程池可以工作 - 但如果可能的话,我喜欢有一个简单的方法(=尽可能少的额外代码(。基于任务的设计也朝着这个方向发展(我认为(。有没有简单的解决方案?
1000 个单位的信号量。 让 4 个线程中的每一个都围绕信号量 wait(( 和工作函数循环。
然后,所有线程都将处理该函数,直到它被执行 1000 次。即使其中三个线程卡住并花费很长时间,第四个线程也将处理其他 997 呼叫。
[编辑]呵呵..此外,标准 C++11 库不包括信号量。然而,信号量是一个基本的操作系统 sunchro 原语,因此应该很容易调用,例如。与POSIX。
您可以使用 Exectuors 的任一引用实现,然后通过以下方式调用该函数
#include <experimental/thread_pool>
using std::experimental::post;
using std::experimental::thread_pool;
thread_pool pool_{1};
void do_big_task()
{
for (auto i : n)
{
post(pool_, [=]
{
// do your work here;
});
}
}
执行者将在C++17到来,所以我想我会早点进入。
或者,如果您想尝试另一种风格的执行器,那么有一个语法略有不同的最新实现。
鉴于您已经能够将调用分段为单独的实体和要处理的线程。一旦方法是使用std::package_task
(及其关联的std::future
(来处理函数调用,并将它们放在某种队列中。反过来,每个线程都可以拾取打包的任务并处理它们。
您将需要锁定队列以进行并发访问,这里可能会有一些瓶颈,但与线程可能"糟糕的一天"的担忧相比,这应该是最小的。这实际上是一个线程池,但它允许您对任务的执行进行一些控制。
另一种选择是使用 std::async
并将其启动策略指定为 std::launch::async
,缺点是您不控制线程创建本身,因此您取决于标准库控制线程的效率与拥有的内核数量。
无论哪种方法都有效,关键是在合理的样本量上衡量方法的性能。该度量应该是针对时间和资源的使用(线程和保持内核繁忙(。大多数操作系统将包括测量进程资源使用情况的方法。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 当我在其中一个线程执行中(在activemq-cpp中)捕获到特定值时,我如何终止/停止所有其他线程
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 在另一个线程中调用luaL_error会引发qWarning
- 全局变量 多读取器 一个写入器多线程安全?
- C++一个线程如何正确通信其任务已完成?
- 最佳做法是从另一个线程访问 qml 中的Q_PROPERTY
- C++线程:如何在一个线程仍在运行时阻止另一个线程执行 (Win32)
- 是否可以创建一个从不同类调用函数的线程?
- 如何制作一个只能在一个线程上同时执行的函数?
- 结束另一个线程中使用的对象的生存期
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 一个线程等待多个线程事件
- 两个线程一个使用流 Api,另一个线程创建文件失败并出现错误ERROR_SHARING_VIOLATION
- C 两个线程一个用于输入,一个用于输出
- 2个线程 - 一个带有OpenGL窗口的线程,第二个带有WXWIDGETS的窗口
- 每个线程一个类实例,C++11
- 多线程-一个作家和一个读者-我们需要使用储物柜吗
- Cuda如何从全局函数运行多个线程?一个运行多个线程的内核