我剛開始使用標準庫開始潛入多線程中。以下是我到目前爲止所做的。儘管它在原理上工作,但一旦完成後它不會啓動新線程,而是在最後4個線程完成後啓動4個線程,因此如果任務花費的時間不等,則效率不高。另外,如果他們沒有按照正確的順序完成,他們必須等待後續工作完成,直到評估結果。我如何確保在任何時候都有一定數量的線程? (另外,這是線程的一個很好的用法嗎?)
我怎樣才能實現總是有4個線程(直到工作耗盡)?我想你會需要使用某種觀察功能,但我不明白如何沒有信號/插槽。如果您可以在線向我指出正確的手冊,我也會很高興。
另外,由於我在今天之前沒有使用多處理的經驗,請告訴我在哪裏可能會採用不好的做法。
預先感謝您!
mueslo
這裏是線程任務:
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();
}
}
和?你有一個cliffhanger在那裏結束...... – SirGuy
好吧,我還不是真的很熟悉原子數據類型。 – mueslo
不,原子在這種情況下是一個全局變量 - 我想一個引用也可以工作 - 無論哪種方式,它幾乎都是相同的東西。 –