2011-06-21 86 views
0

我有一个类指针的列表。我有一个从这些指针调用方法的函数。列表中的每个指针都是来自主类的派生类。我目前正在做的是遍历列表并调用列表中第一个指针的方法,等待它完成,然后转到第二个类对象指针并调用方法等。使用fork执行多个命令

现在我有20个派生类,它将永远完成整个列表。所以我想用叉子来执行一次,也许4-5类的方法,使整个过程是多快..

list<Myclass *> check; 

myfunc(list<Myclass *> check) 
{ 
    for(list<Myclass*>::iterator a= check.begin();a!=check.end();a++) 
      (*a)->run(); 
} 

这是有点什么,我有一个骨架... 我想要什么就像每次它会分叉并创建一个子进程来执行该命令并移动到下一个进程...

+1

在那里有问题吗? – tenfour

回答

1

是的,你可以使用fork()在子线程中做一些工作。但是,一旦子进程完成,它就会返回并且不会在它们之间共享数据。我不清楚你的实现,但如果意图是产生一些进程来做一些额外的工作,那么这似乎是好的,但你可能想要一个线程,而不是叉。

0

您更愿意启动一个线程而不是fork一个进程。涉及指针时更容易,因为指针可以在进程内共享,但不能在外部共享。

此外,分叉进程有一些性能开销。

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(); 
} 
+0

那么我如何使用线程? –

+0

取决于你的操作系统,或者你可以看看boost :: thread http://www.boost.org/doc/libs/1_46_1/doc/html/thread.html –

+0

我正在使用linux ... –

0

,所以我想用叉子来执行一次,也许4-5类的方法,使整个过程是多快..

由于许多其他人已经提到过,你可能想在这里使用线程而不是叉。 fork的开销远远超过产生新线程的开销。

其他人没有说的是产卵线程或进程并不能保证加速。例如,如果一次生成更多的CPU绑定线程数量,而不是可用CPU数量,则可能会减速而不是加速。会发生什么情况是,每个线程都会与其他线程竞争,从而开启有限数量的CPU。一个线程将运行一段时间,然后换出另一个线程。

这是一个好主意,使活动线程的数量少于可用CPU的数量。即使你这样做,当其他一些CPU绑定的应用程序恰好同时运行时,仍然可能遇到麻烦。