'n'boost :: thread实例做'm'个工作

时间:2012-04-20 00:52:34

标签: c++ boost-thread

我正在编写一个进化代码,其中每一代都有(比如说)100个生物,并且每个生物的适应度计算都是一个易于并行化的程序。现在,我不想完全创建100个独立的线程,并且想要将这个数字(同时运行的线程)作为硬件并发的函数来决定(让我们假设这个数字暂时为8)。

我想象的标准是我必须在100个生物体上运行一个功能(适应度函数)并且同时运行8个线程。

任何人都可以使用boost :: thread_group给我一个简单但有效的方法吗?我对太多新概念(Callback等)感到困惑。因此,非常感谢一个简单的c ++片段:)

TIA 问候, 尼基尔

1 个答案:

答案 0 :(得分:0)

我不确定健身函数返回的是什么,更不用说了,但有一个想法就是在它周围编写一个包装函数,称之为“m”次 - 在这种情况下是100/8,或12次。然后创建一个循环“n”次循环,每次调用thread_group :: add_thread,它会生成一个调用包装函数的新线程。

基本理念是这样的:

/* ??? */ 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函数调用语法,但它足够接近。希望这会有所帮助。