Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 根据单个任务的时间需求动态创建线程_C++_Multithreading - Fatal编程技术网

C++ 根据单个任务的时间需求动态创建线程

C++ 根据单个任务的时间需求动态创建线程,c++,multithreading,C++,Multithreading,假设我有一个可调用对象列表,比如 std::列出任务; 任务是在一个无限循环中运行它们 void run_all(常量布尔和中止){ while(true){ 用于(常数自动和ptr:任务){ 如果(中止)返回; (*ptr)(); } } } 只要每个“任务”在短时间内完成,就可以了。现在,我想添加一个要求,即每当一个任务需要的时间超过一个特定的阈值时,就应该创建一个新线程,以便其他任务不必等待一个特定的长时间运行的任务 目前我能想到的关于代码复杂性的最简单解决方案是为每个任务创建一个线程

假设我有一个可调用对象列表,比如

std::列出任务;
任务是在一个无限循环中运行它们

void run_all(常量布尔和中止){
while(true){
用于(常数自动和ptr:任务){
如果(中止)返回;
(*ptr)();
}
}
}
只要每个“任务”在短时间内完成,就可以了。现在,我想添加一个要求,即每当一个任务需要的时间超过一个特定的
阈值时,就应该创建一个新线程,以便其他任务不必等待一个特定的长时间运行的任务

目前我能想到的关于代码复杂性的最简单解决方案是为每个任务创建一个线程:

void run_all(常量布尔和中止){
自动作业=[&](标准::共享任务){
而(!中止){
(*任务)();
}
};
std::列出线程;
用于(自动和ptr:任务){
线程。向后放置(作业,ptr);
}
用于(自动&t:线程){
t、 join();
}
}
但这可能会创建许多线程。 根据任务需要完成的时间长短,实现运行任务和动态创建线程的适当方法是什么?说我们有一些

std::chrono::持续时间阈值;
目标是运行第一个任务,如果第一个任务在完成之前的时间不超过
阈值
,则继续执行下一个任务,但如果第一个任务未在阈值之前完成,则创建一个新线程并行运行其余任务。总的目标是:

  • 如果某个线程中没有已完成的任务,因此另一个任务在特定时间段内开始运行
    阈值
    ,则应创建一个新线程,以便可能在很短时间内运行的其他任务不必等待
  • 如果有3个以上的线程在每个周期内至少完成一个任务
    阈值
    ,则应加入其中一个线程
  • 有些任务本身可能会无限期地运行。这应该不会对其他任务产生影响
什么是满足这些需求的适当实现,或者至少做一些相关的事情,或者至少是实现的概念?
还是仅仅创建一堆线程就可以了?(我考虑在Raspberry Pi这样的低性能机器上运行这样一个应用程序,以及一组需要处理的50到300个任务。)

看起来您正计划从多个线程访问
abort
。在这种情况下,将其设置为
std::atomic
.TL;博士看来你已经有了线程,否则你怎么能在另一个任务还在运行的时候接受新任务?你是在寻找线程池吗?你基本上想要创建一个固定数量的线程并在其中安排任务。不幸的是,这在C++中并不容易实现,因为它不支持现在的函数的挂起恢复机制。英特尔TBB或OpenMP提供此功能。但是如果您有静态任务(在并行区域之前定义的任务),您也可以使用一些简单的线程池解决方案。为什么要等待每个任务的阈值?您可以简单地使用大量工作线程并使它们保持忙碌状态。当一项任务完成后,开始下一项任务