実行するタスクへのポインターの std::deque キューがあると仮定すると、一度に実行されるスレッドの数が CPU コアの数に制限されるようにする最善の方法は何ですか? つまり、タスクが完了した後、残りのタスクが引き続き起動されます。
以前の投稿用に次のコードを作成しましたが、今抱えている問題は、説明したことを実装するための最善の戦略がわからないことであり、意見を求める価値があるかもしれないと考えました.
上記の「ポインタの std::deque キュー」は、コード内の deque mtasks を参照していないことに注意してください。以前に完了したタスクを保存するためにこれを使用しているため、この両端キューからタスクをポップしたくありません。
プログラムで、プロンプトでtask p1 p2 p3 p4 p5のように入力し、次にinfoを入力して、それぞれの現在のステータスを確認します。現在、5 つのタスクすべてがほぼ同時に完了していることに注意してください。ただし、実際に必要なのは、最初の 2 つ (デュアル コア マシン) を完了し、次に次の 2 つなどです。
その理由は、実際にはこれらのタスクに何時間もかかる可能性があるため、MATLAB などにロードできるように、最初の多くの結果をより早く取得したいからです。
自分自身とサンプルコードが明確になったことを願っています。thread::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;
};