2011-06-21 33 views
0

私はクラスポインタのリストを持っています。私はこれらのポインタからメソッドを呼び出す関数を持っています。リストの各ポインタは、メインクラスの派生クラスです。私が現在行っていることは、リストを反復し、リスト内の第1ポインタのメソッドを呼び出し、終了するのを待ってから、第2クラスのオブジェクトポインタに移動してメソッドを呼び出すなどです。複数のコマンドを実行するためのforkの使用

私は20の派生クラスを持っています。リストを完成させるのは永遠に終わりです。だから私は、私が欲しいもの ...全体のプロセスは非常に速い..

list<Myclass *> check; 

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

これはちょっと私が持っているもののスケルトンであるということであるように、一度に多分4-5クラスメソッドを実行するためにフォークを使用していましたコマンドを実行して次のコマンドに実行するために子プロセスをforkして作成するたびに同じです...

+1

どこかに質問がありますか? – tenfour

答えて

1

はい、fork()を使用して子スレッドで作業を行うことができます。しかし、子プロセスの処理が完了すると、子プロセスは戻り、それらの間でデータを共有しません。私はあなたの実装についてはっきりしていませんが、いくつかの作業を行うためにいくつかのプロセスを起動することが意図されているのであれば、それはOKと思われますが、おそらくスレッドではなくフォークが必要です。

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

ご使用のOSによって異なりますが、boost :: threadを見ることができます http://www.boost.org/doc/libs/1_46_1/doc/html/thread.html –

+0

私はLinuxを使用しています... –

0

だから私は、全体のプロセスはそれほど速くなるように、一度に多分4-5クラスメソッドを実行するためにフォークを使用していた。..

として他にも多くのことが既に言及されていますが、ここではスレッドを使用するのではなく、スレッドを使用したいと思うかもフォークには新しいスレッドを生成するよりもはるかに多くのオーバーヘッドがあります。

他の人が言っていることは、スレッドやプロセスを生成してもスピードアップが保証されないということです。たとえば、利用可能なCPUの数よりも多くのCPUバウンドスレッドを一度に生成すると、スピードアップではなく減速を得ることができます。何が起こるかは、これらのスレッドのそれぞれが、限られた数のCPUを使用するために他のスレッドと競合することです。スレッドは少し時間がかかり、別のスレッドにスワップアウトされます。

アクティブなスレッドの数を利用可能なCPUの数より少なくすることをお勧めします。そうしても、他のCPUバインドされたアプリケーションが同時に実行されている場合でも、問題に遭遇する可能性があります。

関連する問題