今日、標準ライブラリを使用してマルチスレッドに飛び込み始めました。以下は、これまでに思いついたものです。原則として動作しますが、1 つのスレッドが終了すると新しいスレッドを開始するのではなく、最後の 4 つのスレッドが終了すると 4 つのスレッドを開始するため、タスクにかかる時間が等しくない場合はあまり効率的ではありません。また、正しい順序で終了しない場合、結果が評価されるまで後続の作業が終了するのを待たなければなりません。
(作業がなくなるまで) 常に 4 つのスレッドを保持するにはどうすればよいですか? ある種のウォッチャー機能を使用する必要があると思いますが、シグナル/スロットなしで正確にどのように可能かわかりません。オンラインの正しいマニュアルを教えていただければ幸いです。
また、今日までマルチプロセッシングを使用した経験がないので、悪い習慣をどこで採用した可能性があるか教えてください。
前もって感謝します!
ミューズロ
スレッド化されたタスクは次のとおりです。
void burn_task(MyClass* obj)
{
//computationally intensive
obj->burn();
}
そして、これがどのように呼び出されるかです:
void getsStuffDone()
{
//initialise everything
int samples = 1000;
int num_threads = 4;
std::vector<MyClass*> myclasslist;
std::vector<std::thread*> threadlist;
myclasslist.resize(num_threads);
threadlist.resize(num_threads);
int i = 0;
//do the work
while(i+1<samples)
{
//current_num_threads = min(num_threads, num_tasks_left)
int current_num_threads = (samples-i-1>num_threads)? num_threads : samples-i-1;
//create threads
for(int t=0; t<current_num_threads; ++t)
{
myclasslist[t] = new MyClass(other_parameters,i+1); //i+1 so seed is never zero
threadlist[t] = new std::thread(burn_task, myclasslist[t]);
++i;
}
//wait to finish, evaluate and clean up (delete)
for(int t=0; t<current_num_threads; ++t)
{
threadlist[t]->join();
useResultsContainedWithin(myclasslist[t])
delete myclasslist[t];
delete threadlist[t];
}
threadlist.clear();
}
}