Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
データ競合と対策
Search
まりも
May 16, 2024
Programming
0
12
データ競合と対策
非同期処理を非常に難しいものにしている原因の一つである、データ競合と現在考えられているその対策について解説します。
まりも
May 16, 2024
Tweet
Share
More Decks by まりも
See All by まりも
メンタルモデルから見るオブジェクト設計
hrmstrsmgs
0
120
技術的負債
hrmstrsmgs
0
150
よい設計のプログラムを作るには
hrmstrsmgs
0
57
歴史から理解するJavaScript
hrmstrsmgs
0
34
論理的な考え方
hrmstrsmgs
0
39
論理的な話し合いはなぜ必要か
hrmstrsmgs
0
23
腕のある技術者はなぜ
hrmstrsmgs
0
56
疑似乱数の生成
hrmstrsmgs
0
25
構造化プログラミング
hrmstrsmgs
0
51
Other Decks in Programming
See All in Programming
Honoとフロントエンドの 型安全性について
yodaka
7
1.5k
SwiftUI移行のためのインプレッショントラッキング基盤の構築
kokihirokawa
0
170
もう僕は OpenAPI を書きたくない
sgash708
6
1.9k
データベースのオペレーターであるCloudNativePGがStatefulSetを使わない理由に迫る
nnaka2992
0
250
iOSでQRコード生成奮闘記
ktcryomm
2
130
AWS Step Functions は CDK で書こう!
konokenj
5
860
Rubyと自由とAIと
yotii23
6
1.9k
Expoによるアプリ開発の現在地とReact Server Componentsが切り開く未来
yukukotani
1
210
バッチを作らなきゃとなったときに考えること
irof
2
550
Ça bouge du côté des animations CSS !
goetter
2
160
DRFを少しずつ オニオンアーキテクチャに寄せていく DjangoCongress JP 2025
nealle
2
290
1年目の私に伝えたい!テストコードを怖がらなくなるためのヒント/Tips for not being afraid of test code
push_gawa
1
650
Featured
See All Featured
YesSQL, Process and Tooling at Scale
rocio
172
14k
A Modern Web Designer's Workflow
chriscoyier
693
190k
How to Ace a Technical Interview
jacobian
276
23k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
4
440
Stop Working from a Prison Cell
hatefulcrawdad
268
20k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
13
1k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.6k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.7k
The Power of CSS Pseudo Elements
geoffreycrofte
75
5.5k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
134
33k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
29
1.1k
Transcript
データ競合と対策
データ競合 public void 預金額を処理する() { var 移動金額 = 預金額1 /
2; this.預金額2 = this.預金額2 - 移動金額; this.預金額1 = this.預金額1 + 移動金額; }
データ競合 public void Increment() { this.Count++; }
データ競合 public void Add(int i) { list.Add(i); }
対策(LOCK) class 預金口座 { decimal 残高; private Object thisLock =
new Object(); public void 預金を下す(decimal 金額) { lock (thisLock) { if (金額> 残高) { throw new Exception("不足しています"); } 残高 -=金額; } } }
対策(LOCK) データ競合 全ての場合に有効 デッドロックに気を付ける 処理 順次、反復、分岐のすべて 利点 簡単 問題点 ロックをかけた部分は並列処理ができない
アムダールの法則を考えると結構大きな問題なんじゃ? 対応言語 ほぼすべての言語
対策(イミュータブル) class 総額 { const int 残高; public: 総額(const int
残高) :残高(残高) {} const 総額 下す(const int 総額) const; };
対策(イミュータブル) データ競合 そもそも起きない 処理 順次、反復、分岐のすべて 利点 データ競合はおきない 問題点 関数型言語っぽい書き方に直さないといけない 対応言語
関数型言語、C++、C#(8以降?)、 オブジェクト指向言語(イミュータブルになるよう気を付けて書けば可能)
対策(ASYNC/AWAIT) データ競合 データ競合がない場合に利用 行数で全体の8割くらいはデータ競合ないんじゃ? 処理 順次、反復、分岐のすべて 利点 同期プログラムと全く同じ感覚で使える 問題点 データ競合に対応できない
データ競合対策は別に必要 対応言語 C#,Visual Basic,F#,Typescript,Python,Ecmascript(2017)C++(17には入らない?)
対策(PLINQなど) var result = from item in list.AsParallel()
where item < 100 select Sqrt(item);
参考に普通のLINQ var result = from item in list
where item < 100 select Sqrt(item);
対策(PLINQなど) データ競合 リストのデータ一つ一つに対して処理する場合 処理 反復のみ 利点 簡単 問題点 多数データを並列の場合しか使えない 対応言語
C#,Java,Scala
対策(REACTIVE EXTENSIONS) データ競合 リストのデータ一つ一つに対して処理する場合 イベントストリーム 処理 基本的には反復 工夫すれば順次、反復、分岐のすべて 利点 比較的簡単
対応できる処理も多い 問題点 多数データとイベントを非同期で扱うときしか使えない アムダールの法則を考えると結構重要な欠点なんじゃ? 対応言語 C#,Visual Basic,Swift,JavaScript,Java
対策(ACTOR) データ競合 対策済み 処理 順次、反復、分岐のすべて ただし非同期処理は気を付けて扱う必要がある 利点 比較的簡単 問題点 非同期処理をしっかり意識しないと実装できない
対応言語 Erlang,Scala,Elixer,C++,C#
対策(スレッド所有権) データ競合 対策済み Actorより深い対応 処理 非同期処理は気を付けて扱う必要がある Actorと同じ 利点 比較的簡単 Actorの一種
問題点 非同期処理をしっかり意識しないと実装できない 対応言語 Ruby(guild),Pony
対策(STM) データ競合 対策済み 処理 非同期処理は気を付けて扱う必要がある 利点 比較的簡単 割と難しいといううわさも 問題点 非同期処理をしっかり意識しないと実装できない
対応言語 C++、F#