gpt4 book ai didi

c++ - 基于boost::threads的队列算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:56:07 25 4
gpt4 key购买 nike

假设有一个 std::deque 指针队列,指向要执行的任务,确保同时运行的线程数限制在 CPU 内核数内的最佳方法是什么?即,任务完成后,其余任务随后启动。

我为之前的帖子制作了以下代码,我现在遇到的问题是我不确定实现我所描述的内容的最佳策略,并且认为这可能值得征求意见。

请注意,我上面提到的“std::deque 指针队列”并不是指代码中的 deque mtasks。我不希望从这个双端队列中弹出任务,因为我正在使用它来存储以前完成的任务。

在程序中输入类似task p1 p2 p3 p4 p5 的提示,然后输入info 来检查每个任务的当前状态。请注意,目前所有 5 个任务大约同时完成。然而,我真正想要的是完成前 2 个(双核机器),然后是下 2 个等等。

这样做的原因是,实际上这些任务可能需要数小时,因此我想尽快获得第一批结果,以便我可以将它们加载到 MATLAB 或其他软件中。

我希望我自己和示例代码都清楚。我猜 thread::hardware_concurrency() 涵盖了核心部分的数量....

谢谢A.

#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;
};

最佳答案

您所描述的是线程池模式,其中您有固定数量的线程和一组要使用这些线程执行的任务(# tasks > # threads)。

wikipedia有关线程池模式的条目有更多信息。您可以自己编写,或使用类似非官方的 boost threadpool library 之类的东西.

关于c++ - 基于boost::threads的队列算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10377026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com