Upgrade to Pro — share decks privately, control downloads, hide ads and more …

データ競合と対策

 データ競合と対策

非同期処理を非常に難しいものにしている原因の一つである、データ競合と現在考えられているその対策について解説します。

まりも

May 16, 2024
Tweet

More Decks by まりも

Other Decks in Programming

Transcript

  1. データ競合 public void 預金額を処理する() { var 移動金額 = 預金額1 /

    2; this.預金額2 = this.預金額2 - 移動金額; this.預金額1 = this.預金額1 + 移動金額; }
  2. 対策(LOCK) class 預金口座 { decimal 残高; private Object thisLock =

    new Object(); public void 預金を下す(decimal 金額) { lock (thisLock) { if (金額> 残高) { throw new Exception("不足しています"); } 残高 -=金額; } } }
  3. 対策(イミュータブル) class 総額 { const int 残高; public: 総額(const int

    残高) :残高(残高) {} const 総額 下す(const int 総額) const; };
  4. 対策(REACTIVE EXTENSIONS) データ競合 リストのデータ一つ一つに対して処理する場合 イベントストリーム 処理 基本的には反復 工夫すれば順次、反復、分岐のすべて 利点 比較的簡単

    対応できる処理も多い 問題点 多数データとイベントを非同期で扱うときしか使えない アムダールの法則を考えると結構重要な欠点なんじゃ? 対応言語 C#,Visual Basic,Swift,JavaScript,Java