0

次のコードがあります。

for(int i=0;i<n;i++){
  funcA(i);
  funcB(i);
}

マルチスレッドを使用して実装したいのですが、そうするには2つの方法があると思います(両方とも、各スレッドは[0、n]のサブ範囲を取ります):

1) 両方の機能を実行するスレッド クラスを作成します。

2) 2 つのスレッド クラスを作成します。1 つ目は funcA() を実行し、2 つ目は funcB() を実行します。たとえば、次のように、それぞれに独自のループがあります。

for(int i=0;i<n;i++){
  funcA(i);
}

for(int i=0;i<n;i++){
  funcB(i);
}

どれが最高ですか?またはそれらは同等ですか?

4

3 に答える 3

3

答えは、関数が相互に依存しているかどうかによって異なります。

一方の実行が他方の影響を受ける変数に依存しない場合は、自由に実行でき、両方の関数を別々のスレッドで実行することをお勧めします。

ただし、実行順序の依存関係がある場合は注意してください。一部の問題を回避するためにミューテックスを使用できますが、順次実行する方がよい場合があります。

編集:コメントで述べたように、の実行はにfuncB(i)依存しますがfuncA(i){funcA(i); funcB(i)}ブロックは互いに独立しています。

(0,n] の範囲を k 個のスレッドに分割することで、それらの複数を並列に実行できます。

于 2013-08-11T15:07:15.787 に答える
1

あなたが提供した2つのアプローチから、2番目のアプローチの方が優れています。

理由:最初のアプローチは、各ループを実行するスレッドを作成していることを意味しますがn、2 番目のアプローチは 2 つのスレッドを作成し、1 つを作業に割り当てfuncA、もう 1 つを on に割り当てますfuncB。次に、それらが完了したら、次の反復に進み、繰り返します。これは、スレッドではなく共通の目標に向かって作業する 2 つのスレッドがあるため、はるかに優れたアプローチですn

于 2013-08-11T15:05:25.503 に答える