0
int total = 200; // total is a global variable

void process()
{
    int local;
    for( int i = 0 ; i< 100 ; i++ ) 
    {
         local = total;
         local--;
         total = local;
    }
}

2 つのスレッドが並行して呼び出した場合、両方のスレッドが処理を終了した後の合計process()の最大値と最小値は?

最小値は0になると思いますが、よくわかりません。最大値?? 199 ?

4

1 に答える 1

1

C11では、これは「未定義の動作」として定義されています。つまり、これについての保証はありません。

これは多かれ少なかれC99にも当てはまりますが、C99は並行性を念頭に置いて作成されたものではありません。各スレッドは他のスレッドを認識していません。

各スレッドは、グローバル変数'total'を100回調べます。

ただし、各スレッドは独自のローカルコピーを取得し、それをデクリメントして、グローバル変数totalに書き戻します。

ただし、スレッドはグローバル変数'total'を取得し、関数が終了するまで書き戻さずに一時的なコピーを保持する場合があります。この場合、下限は100になる可能性があります。

ローカルコピーを保持しない場合、両方が同期して合計を取得し、ローカルコピーをデクリメントし、書き戻すため、合計は1以下しか減少しない可能性があります。

スレッドを同期する方法がないため、一方が合計を「取得」して変更し、もう一方が待機している間に「解放」するため、0に達する保証はありません。

ミューテックス、セマフォなどは、スレッド間でアクセスを同期する方法です。

擬似コード:

process() {
  for (loop) {
    grab_mutex(total);  // Will wait till total is free
    total--;
    release_mutex(total);
  }
}

ただし、下限は間違いなく0です。デクリメントの機会は200を超えません。

于 2012-05-02T03:18:22.840 に答える