2011-05-13 132 views
2

我目前使用boost線程池的線程數等於核心數。我已經安排了,使用游泳池的日程功能說10個任務。例如, 假設我有功能使用線程池的多線程

void my_fun(std::vector<double>* my_vec){ 
    // Do something here 
} 

這裏只是用來做一些臨時的計算參數「my_vec」。我把它傳遞給函數的主要原因是當我再次調用函數時,我想重用這個向量。

目前,我有以下

// Create a vector of 10 vectors called my_vecs 

// Create threadpool 
boost::threadpool::pool tp(num_threads); 

// Schedule tasks 
for (int m = 0; m < 10; m++){ 
    tp.schedule(boost::bind(my_fun, my_vecs.at(m))); 
} 

這是我的問題:我想只有2載體,以取代10個向量的向量。如果我想安排10個任務,並且我有2個內核,則最多可以有2個線程(任務)在任何時間運行。所以我只想使用兩個向量(一個分配給每個線程)並使用它來執行我的10個任務。我怎樣才能做到這一點?

我希望這很清楚。謝謝!

+0

也許http://stackoverflow.com/questions/3344028/how-to-make-boostthread-group-execute-a-fixed-number-of-parallel-threads會有幫助嗎? – sarnold 2011-05-13 05:36:12

回答

1

很可能boost::thread_specific_ptr是你需要的。下面是你如何在你的功能中使用它:

#include <boost/thread/tss.hpp> 
boost::thread_specific_ptr<std::vector<double> > tls_vec; 

void my_fun() 
{ 
    std::vector<double>* my_vec = tls_vec.get(); 
    if(!my_vec) { 
     my_vec = new std::vector<double>(); 
     tls_vec.reset(my_vec); 
    } 
    // Do something here with my_vec 
} 

它將重新使用調度到同一線程的任務之間的向量實例。如果池中有更多的線程,可能會有兩個以上的實例,但由於在其他答案中提到的搶佔,您確實需要每個正在運行的線程實例,而不是每個核心。

您不應該刪除存儲在thread_specific_ptr中的矢量實例;當相應的線程完成時,這些將被自動銷燬。

0

雖然只有兩個線程可以同時調度,但在許多線程系統中,線程會得到時間片,因此線程在執行任務期間被搶佔。因此,第三個(第四,...)線程將有機會工作,而第一個和第二個線程的處理仍然不完整。

我不知道這個特定的線程實現,但我的猜測是它將允許(或運行在支持環境)先發制人調度。我對線程的思考方式是儘量保持簡單,讓每個線程都擁有自己的資源。

1

我不會將線程數限制爲核心數。請記住,在我們擁有多核處理器之前,多線程編程已經進行得很久。這是因爲線程可能會阻塞某些資源,並且下一個線程可以跳入並使用CPU。

+0

軟件線程切換很昂貴。通常的方式不僅僅是等待大多數資源被加載(並且由於單核上的性能原因,我們沒有多線程,而是多任務處理)。你所描述的是爲什麼我們有時在單個內核上有多個_hardware_線程。 – Bahbar 2011-05-13 07:10:15

+0

我不同意。有時可能會更昂貴,但我不同意這是典型的。您必須根據應用程序對應用程序進行評估。相信我,單個核心上的多個線程肯定能夠提高性能。特別是當一個線程負責UI交互時。例如,Apple包括[NSOperations for iPhone apps](http://www.icodeblog.com/2010/03/04/iphone-coding-turbo-charging-your-apps-with-nsoperation/)。 iPhone是單核心,但蘋果認爲需要多個線程。 – 2011-05-13 11:50:10

+1

我同意我的說法是過度清理(你的UI例子是一個很好的例子)。但對於僅計算?這就是我的問題。 – Bahbar 2011-05-13 12:07:32