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を超えません。