我有一个类指针列表。我有一个函数从这些指针调用一个方法。列表中的每个指针都是来自主类的派生类。我目前正在做的是遍历列表并调用列表中第一个指针的方法,等待它完成,然后转到第二个类对象指针并调用方法,依此类推。
现在我有20个派生类,它将永远通过列表完成。所以我想使用fork一次执行4-5个类方法,这样整个过程就会快得多......
list<Myclass *> check;
myfunc(list<Myclass *> check)
{
for(list<Myclass*>::iterator a= check.begin();a!=check.end();a++)
(*a)->run();
}
这有点像我拥有的...... 我想要的就像每次它将分叉并创建一个子进程来执行命令并移动到下一个命令...
答案 0 :(得分:1)
是的,你可以使用fork()在子线程中做一些工作。但是,一旦子进程完成它的工作,它就会返回,并且您不会在它们之间共享数据。我不清楚你的实现,但如果意图产生一些进程来做一些额外的工作,那么这似乎没问题,但你可能想要一个线程,而不是fork。
答案 1 :(得分:0)
您更有可能想要启动一个线程而不是fork一个进程。当涉及指针时更容易,因为指针可以在进程内共享但不在外部共享。
此外,分支进程有一些性能开销。
答案 2 :(得分:0)
但是你没有用叉子传回任何记忆。你可能想要一个线程。这是如何做到的:
int i = 0;
int n = 4; //or 5;
list<Myclass> check; // You can't use pointers here though, as the memory is not shared.
myfunc(list<Myclass> check)
{
for(list<Myclass>::iterator a= check.begin();a!=check.end();a++) {
if(i >= n) {
wait();
} else {
if(fork() == 0) {
a->run();
exit(0);
} else {
i++;
}
}
}
// Prevent a voodoo priest from making zombies of these processes.
while(i-->0) wait();
}
答案 3 :(得分:0)
所以我想使用fork一次执行4-5个类方法,这样整个过程就会快得多......
正如许多其他人已经提到过的,你可能想在这里使用线程而不是fork。与生成新线程相比,fork有更多的开销。
其他人没有说的是,产生线程或进程并不能保证加速。例如,如果您同时生成比可用CPU数量多得多的CPU绑定线程,则可能会减速而不是加速。会发生的是,这些线程中的每一个都与其他线程竞争有限数量的CPU。一个线程将运行一点时间,然后换掉另一个。
最好使活动线程数小于可用CPU数。即使你这样做,当一些其他CPU绑定的应用程序碰巧同时运行时,你仍然会遇到麻烦。