1
float myTotalAmount=0; 
void update(float amt){ 
    myTotalAmount+= amt; 
} 

タスク呼び出しupdate(10)コンテキストスイッチは変数の変更にどのように影響しますか?

タスクBのコールupdate(5);

はどのように条件がmyTotalAmountの結果に影響を与えるレースすることができますか? タスクAが終了する前に

タスクBは、何らかの原因でコンテキストスイッチが起こったので、updateメソッドを呼び出すことができるのですか?私はrace conditionを理解しようとしていますすべてのオーバー

+0

私はこの質問をcs.stackexchange.comに属しているため、トピックを外すように投票しています –

答えて

1

int myTotalAmount = 0

タスクA

Updata(10);

タスクB

Updata(5)


myTotalAmount+= amt;はアトミックな操作ではありません。この行は、複数のマシンコマンドに変換されます。言われて、タスクAがレジスタにmyTotalAmountの値を保存しますが、その値は0になります。コンテキストスイッチが今happendsとTask B開始が実行されている場合、それは5であることをmyTotalAmountを変更します今OSがすることを決定すること

再度Task Aを実行してください。 myTotalAmountの値が今5ですが、我々はすでに値を抽出し、レジスタにそれを保存し、それが0でしました 。実行はmyTotalAmount0たその時点から継続されます。今myTotalAmount0+10を割り当てられますし、それは10の代わり15になります。

は、この問題を解決するには、競合状態を防ぐために、いくつかの同期を展開することができます。ロックを使用することができます。

関連する問題