我不确定适应度函数返回什么,更不用说,但一个想法是围绕它编写一个包装函数,将其称为“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 函数调用语法是否正确,但它足够接近。希望这会有所帮助。