少し調べましたが、役に立たないものは見つかりませんでした。誰かがこの並行性/同期の問題を私に助けてくれますか?共有データへの同時/非同期アクセス
、なぜ正確に。s
がs
によって得られる値0
とi
ローカル変数の初期値との共有データを、あるとは非同期に実行されている次のプログラムの5つのインスタンス、与えられ?
私はどの値が知りたいのですが
for (i = 0; i < 5; i ++) { s = s + 1; }
少し調べましたが、役に立たないものは見つかりませんでした。誰かがこの並行性/同期の問題を私に助けてくれますか?共有データへの同時/非同期アクセス
、なぜ正確に。s
がs
によって得られる値0
とi
ローカル変数の初期値との共有データを、あるとは非同期に実行されている次のプログラムの5つのインスタンス、与えられ?
私はどの値が知りたいのですが
for (i = 0; i < 5; i ++) { s = s + 1; }
答えていない答えは:Uaaaagh、そんなことしないでください。
あなたの質問の意味でより多くの答えがあります:原則として、値は完全に定義されていないので、可能です。あなたは、同時書き込みが何らかの形でアトミックであり、完全なガベージにならないという厳密な保証はありません。
実際には、機械語未満のサイズの書込みはどこでもアブドルですが(私が知っている限り)、定義された順序はありません。また、通常、スレッド/プロセスがどの順序でスケジュールされているかはわかりません。だから、あなたは "無駄なゴミ"という値を見ることはありませんが、それが何であるかを知ることはできません。それは5以上(最大25)になります。
原子インクリメントが使用されていないため、値の読み取り、インクリメント、および書き戻しの間に競合があります。結果が書き戻される前に値が別のインスタンスによって書き込まれている場合、以前に終了した書き込み(および増分)は無効です。そうでない場合は、両方の増分が有効です。
しかし、各インスタンスは少なくとも5回値を増分するため、理論的な「ゴミの総量」の可能性から離れて、5未満の値で終了することはできません。したがって(1)と(2)は不可能ですが、(3)は不可能です。
問題をお寄せいただきありがとうございます。私はこれが奇妙なアイディアだと知っています。それはちょうど私が正しいと確信することができなかった試験の質問だった。私自身の構想はあなたと同じでした。 2人の天才が間違っていることはありませんか? ;-) –