boost::基于线程的队列算法
boost::threads based queue algorithm
假设有一个:d指向要执行的任务的指针队列,那么确保一次运行的线程数限制在CPU内核数的最佳方法是什么?即任务完成后,剩余的任务随后启动。
我为之前的帖子编写了以下代码,我现在遇到的问题是我不确定实现我所描述的内容的最佳策略,并认为可能值得征求意见。
请注意,我上面提到的"std::d eque 队列"并不是指代码中的 deque mtasks。我不希望从这个 deque 中弹出任务,因为我正在使用它来存储以前完成的任务。
在程序中键入类似的东西, 任务 p1 p2 p3 p4 p5 ,在提示符下,然后信息以检查每个的当前状态。请注意,目前所有 5 个任务大约在同一时间完成。但是,我真正想要的是前 2 个要完成的(双核机器(,然后是接下来的 2 个等。
这样做的原因是在实践中这些任务可能需要几个小时,因此我想更快地获得第一批结果,以便我可以将它们加载到 MATLAB 或其他什么中。
我希望我使自己和示例代码清楚。我猜线程::hardware_concurrency(( 涵盖了内核部分的数量....
谢谢一个。
#include <iostream>
#include <string>
#include <sstream>
#include <boost/thread.hpp>
using namespace std;
class task {
public:
string mname;
bool completed;
void start()
{
int a = 0;
for (int i=0 ; i<10000; i++)
{
for (int j=0 ; j<100000; j++)
{
a= i*2;
}
}
this->completed = true;
}
task(string name)
{
mname = name;
completed = false;
}
};
class taskManager{
public:
boost::thread_group threads;
void startTask( string name )
{
//add new task to vector list
mtasks.push_back( task(name) );
// execute start() on a new thread
threads.create_thread( boost::bind( &task::start, &mtasks.back()) );
}
int tasksTotal()
{
return mtasks.size();
}
string taskInfo(int i)
{
string compstr("Not Completed");
if ( mtasks.at(i).completed == true )
{
compstr = "Completed";
}
return mtasks.at(i).mname + " " + compstr;
}
private:
deque<task> mtasks;
};
int main(int argc, char* argv[])
{
string cmd, temp;
stringstream os;
bool quit = false;
taskManager mm;
cout << "PROMPT>";
while (quit == false)
{
//Wait for a valid command from user
getline(cin,cmd);
// Reset stringstream and assign new cmd string
os.clear();
os << "";
os << cmd;
//parse input string
while (os >> temp)
{
if ( temp.compare("task") == 0 )
{
while (os >> temp) { mm.startTask( temp ); }
}
if ( temp.compare("info") == 0 )
{
// Returns a list of all completed and not completed tasks
for (int i = 0; i<mm.tasksTotal(); i++)
{
cout << mm.taskInfo(i).c_str() << endl;
}
}
if ( temp.compare("quit") == 0 ){ quit = true; }
}
cout << "PROMPT>";
}
mm.threads.join_all();
return 0;
};
您描述的是线程池模式,其中您有固定数量的线程和一组您希望使用这些线程执行的任务(# 任务> # 线程(。
关于线程池模式的维基百科条目包含更多信息。你可以自己编写,也可以使用非官方的 boost 线程池库之类的东西。
相关文章:
- C++ 多线程 - 与线程合并排序的算法替代
- 如何在新的 C++17 并行算法中管理线程?
- OpenMP:共享同一算法的单线程和多线程实现
- C++多线程算法创建在同一 CPU 线程上运行的多个线程
- 多线程 - 彼得森算法不起作用
- C++STL(ExecutionPolicy)算法如何确定要使用多少并行线程
- 从QTcpSocket上的数据流中连续运行复杂算法的最佳Qt线程解决方案是什么
- 多线程galib247遗传算法陷入局部极大值
- 线程:如何在C或C++中精确计算算法的执行时间(函数的持续时间)
- C++ STL 算法(列表排序)OpenMP/多线程实现
- 在多个相互依赖的线程上进行封送处理和等待的算法、模式或最佳实践
- boost::基于线程的队列算法
- 为什么这种令人尴尬的并行算法的性能没有随着多线程而提高
- 多线程数独算法c++
- 面向通知-等待模式的c++多线程算法设计
- 我可以使用QTimer实现多线程算法
- 多线程二进制树算法
- 高效实现多线程排序算法的关键是什么?幼稚的实现无法正常工作
- Lamport 面包店算法的实现存在超过 1 个线程的 seg 错误
- c++中带线程的蛮力搜索算法并行化