2013-10-02 35 views
2

我剛開始使用標準庫開始潛入多線程中。以下是我到目前爲止所做的。儘管它在原理上工作,但一旦完成後它不會啓動新線程,而是在最後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(); 

    } 
} 

回答

2

處理線程的一組數的常見方法執行一些任務是啓動X線程,然後讓每個線程從普通隊列中選擇它「工作」。在一個非常簡單的情況下,你會簡單地說,而不是在創建線程循環做i+1i++,讓istd::atomic<int>,並做到:

void some_thread_function() 
{ 
    for(;;) 
    { 
    int work_on = i.fetch_add(1);  // "work_on = i++;" 
    if (work_on >= samples) 
     break; 
    ... // do actual work 
    } 
} 

在更復雜的情況下,你會有一個等待隊列,其中包含更復雜的數據類型來描述要完成的「工作」。

這意味着你總是擁有「正確」的線程數量,並且沒有創建/拆除線程的開銷(如果線程運行了相當長的時間(十分之一秒或更長),這不是一個但是對於「短」運行時間,這很可能是一個因素。

+0

和?你有一個cliffhanger在那裏結束...... – SirGuy

+0

好吧,我還不是真的很熟悉原子數據類型。 – mueslo

+1

不,原子在這種情況下是一個全局變量 - 我想一個引用也可以工作 - 無論哪種方式,它幾乎都是相同的東西。 –

相關問題