我正在编写一个进化代码,其中每一代都有(比如说)100个生物,并且每个生物的适应度计算都是一个易于并行化的程序。现在,我不想完全创建100个独立的线程,并且想要将这个数字(同时运行的线程)作为硬件并发的函数来决定(让我们假设这个数字暂时为8)。
我想象的标准是我必须在100个生物体上运行一个功能(适应度函数)并且同时运行8个线程。
任何人都可以使用boost :: thread_group给我一个简单但有效的方法吗?我对太多新概念(Callback等)感到困惑。因此,非常感谢一个简单的c ++片段:)
TIA 问候, 尼基尔
答案 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函数调用语法,但它足够接近。希望这会有所帮助。