0

次の操作を行うマルチスレッド プログラムにブロックがあります。

void func(args){
    do computation;
    for(i = 0; i < n ; i++)
        value[i] += computed_value;
 }

複数のスレッドがこの関数を実行します。そのため、ロックを使用してプログラムをスレッドセーフにする必要があります。ロックにより、プログラムはシングルスレッドプログラムよりも遅くなります。ロックを使用してみましたが、プログラムが非常に遅くなります。また、いくつかの代替アプローチを提案してください。

4

2 に答える 2

1

コードによると、ロックはありません。アプローチの開始点として、ロックを使用しないのではなく、ロックを使用します。(これ以上明確にしないと、私はそれほど多くを助けることはできません)。可能であれば、計算内の操作をロックしてください。

疑似例

int computation(int i)
    lock();
    i = i + 1;
    unlock();
    return i;
于 2013-09-24T17:27:37.533 に答える
0

質問はかなり一般的であるため、回答として一般的な考えをいくつか示します。

肝心なのは、複数のスレッドが同時に同じメモリの読み取り/書き込みを行うことはできないということです。問題のメモリの読み取りと書き込みをロックすることは、1 つの方法です。それは、独自のロックを使用するか、利用可能な場合はアトミック += 関数を使用します。

私が考えることができる他の2つの一般的な選択肢があります:

1) 各スレッドが配列の個別の部分を担当するようにします。たとえば、配列内に 4 つのスレッドと 20 の要素がある場合、スレッド 1 は要素 0 ~ 4 を処理し、スレッド 2 は要素 5 ~ 9 を処理する、というようになります。

2) スレッドごとに配列の個別のコピーを用意し、配列のコピーを 1 つの最終的な配列に結合します。たとえば、4 つのスレッドがあり、配列に 20 個の要素がある場合、スレッド 1 はコピー 1 で動作し、スレッド 2 はコピー 2 で動作するというようになります。それらが終了したら、4 つのアレイを 1 つに結合する必要があります。

明らかに、2 番目のアイデアはより多くのメモリを必要としますが、問題のパラメーターについてはあまりわかっていないため、これらは一般的なアイデアにすぎません。

于 2013-09-24T20:51:00.130 に答える