2012-04-20 40 views
1

我正在編寫一個進化代碼,每代都有(比方說)100個有機體,並且每個進程的適應度計算都是一個容易並行化的程序。現在,我不希望完全創建100個獨立的線程,並且想要將此數量(同時運行的線程)作爲硬件併發性的函數(讓我們假設此時的數字爲8)。'n'boost ::執行'm'作業的線程實例

我想象的標準是我必須對100個生物體和8個線程同時運行一個函數(健身函數)。

任何人都可以給我一個簡單但有效的方式來做到這一點,使用boost :: thread_group?我對有太多新概念(回調等)有點困惑。因此,一個簡單的C++代碼片段,將不勝感激:)

TIA 問候, 尼基爾

回答

0

我不知道的適應度函數返回,更不用說做,但一個想法是圍繞編寫一個包裝的功能是什麼它稱它爲「m」倍 - 在這種情況下爲100/8或12倍。然後創建一個循環「n」次,每次調用thread_group :: add_thread,這會產生一個調用wrapper函數的新線程。

的基本想法是這樣的:

/* ??? */ fitness_calculation(organism& o){ 
    //... 
} 

// wrapper function 
void calc(std::vector<organism>& v, int idx, int loops){ 
    for(int i = 0; i < loops; i++) 
     fitness_calculation(v[idx + i]);  

} 

int main(){ 
    int num_organisms = 100; 
    std::vector<organism> v(num_organisms); // some array with the organisms 

    int threads = 8; 
    boost::thread_group g; 
    int organisms_per_thread = num_organisms/threads; 

    int i = 0, idx = 0; 
    for ( ; i < threads; ++i, idx += organisms_per_thread) 
     g.add_thread(calc, v, idx, organisms_per_thread); 

    // finish up remainder in this thread 
    calc(v, idx, num_organisms % threads); 
    g.join_all(); 
} 

我不知道如果我有thread_group函數調用語法正確的,但它的足夠接近。希望這有助於。