Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
What is std::sync::atomic
Kentaro Matsumoto
September 03, 2019
Programming
0
42
What is std::sync::atomic
Rustのstd::sync::atomicの必要性と既に定義された型にトレイトを実装する方法を解説しました。
Kentaro Matsumoto
September 03, 2019
Tweet
Share
More Decks by Kentaro Matsumoto
See All by Kentaro Matsumoto
our test strategy on actix-web app
matsu7874
0
500
roadmap to rust 2024
matsu7874
1
1k
Rust tutorial for Pythonista
matsu7874
1
380
Mock testing with mockall
matsu7874
0
59
Write Postgres Extensions with Rust!
matsu7874
0
310
Self-learning Rust way with Clippy.
matsu7874
0
530
Property-Based Testing in Rust
matsu7874
0
610
Search Engine in Rust
matsu7874
0
200
アジャイルな受託開発を3年間やってみて
matsu7874
4
1.1k
Other Decks in Programming
See All in Programming
Chart実装が楽になりました。
keisukeyamagishi
0
120
Get Ready for Jakarta EE 10
ivargrimstad
0
2.9k
Haskellでオブジェクト指向プログラミング
koheisakata
0
130
GoogleI/O2022 LT報告会資料
shinsukefujita1126
0
410
JetpackCompose 導入半年で感じた 改善点
spbaya0141
0
100
【Scrum Fest Osaka 2022】スクラムチームに放り込まれた若手エンジニアの皆さん、どのように技術のキャッチアップをしていくかイメージはついていますか?
miiiki
0
130
GDG Seoul IO Extended 2022 - Android Compose
taehwandev
0
340
Jetpack Compose, 어디까지 알고 있을까?
jisungbin
0
130
Why Airflow? & What's new in Airflow 2.3?
kaxil
0
120
How we run a Realtime Puzzle Fighting Game on AWS Serverless
falken
0
250
Power Automateドリブンのチームマネジメント
hanaseleb
0
200
Android Compose Component - mapping.
taehwandev
0
140
Featured
See All Featured
Optimizing for Happiness
mojombo
365
63k
Git: the NoSQL Database
bkeepers
PRO
415
59k
Building Your Own Lightsaber
phodgson
94
4.6k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
37
3.3k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
269
12k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
237
19k
Making Projects Easy
brettharned
98
4.3k
Statistics for Hackers
jakevdp
781
210k
Visualization
eitanlees
125
11k
Product Roadmaps are Hard
iamctodd
34
6.6k
The Language of Interfaces
destraynor
148
20k
The World Runs on Bad Software
bkeepers
PRO
57
5.3k
Transcript
What is std::sync::atomic 2019/09/13 Shinjuku.rs #6 @FORCIA
自己紹介 • 松本健太郎 ◦ @matsu7874 • フォルシア株式会社 ◦ Webエンジニア ◦
業務でRustを書いている
目次 • 闇雲にデータを共有すると何が起こるのか • Atomicとは • cmpトレイトを実装した
スレッド間でデータを共有すると 何が起こるのか
メモリの様子を拡大してみると 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
シングルスレッドの場合 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 11111111
11111111 11111111 11111111 11111111 11111111 11111111 11111111 書きます!
シングルスレッドの場合 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 読みます!
シングルスレッドの場合 何の問題も無い
マルチスレッドの場合 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 11111111
11111111 00000000 00000000 00000000 00000000 00000000 00000000 書きます!
マルチスレッドの場合 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 11111111
11111111 11111111 11111111 00000000 00000000 00000000 00000000 書いていますよ! 読みます!
マルチスレッドの場合 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 11111111
11111111 11111111 11111111 11111111 11111111 00000000 00000000 まだ書いていますヽ (`Д´)ノプンプン 読了
マルチスレッドの場合 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 11111111
11111111 11111111 11111111 11111111 11111111 00000000 00000000 まだ書いていますヽ (`Д´)ノプンプン 読了 は何を 読んだのか
マルチスレッドの場合 • 同じ値への読み書きが同時に発生すると困る事がある • 対応策 ◦ 操作が不可分にする ◦ 同じ値に操作する数を1にする
Atomicとは
Atomicとは? • 書き込み途中に読まれない • 読み込み途中に書かれない • アーキテクチャによって強い・弱いがあるらしい
std::sync::atomic • Atomic型を提供するモジュール ◦ AtomicBool, AtomicIsize, AtomicIsize • Atomic型はSyncトレイトが実装されている ◦
安全にスレッド間で共有可能 • スレッド間で共有される機能は持っていないのでArcを使う ◦ Arc::new(AtomicUsize::new(0))
Atomic以外の方法はあるの? • Mutex、RWLockがある • それぞれのパフォーマンスは ◦ "Performance Comparison of Mutex,
RWLock and Atomic types in Rust" というスライドが有名
比較を実装した
AtomicUsizeとAtomicUsizeを比較したい • 比較したいときはstd::cmp::PartialEqをimplする。 • AtomicUsizeはstd::sync::atomic::AtomicUsize。 • error[E0117]: only traits defined
in the current crate can be implemented for arbitrary types ◦ 現在のcrateで定義されたtraitだけを任意の型にimpl可能 ◦ どちらも既にあるのでimplできない。
newtypeパターン • 特に何もせずに新しい型だよって言っちゃう ◦ struct Bar(Foo); ◦ https://github.com/rust-unofficial/patterns/blob/master/patterns/newtype.md ◦ 自分で定義した型になら既にあるtraitが実装できる!
None
まとめ • スレッド間でデータ共有したい場合はそれ用の型を使う • Atomicが高速 • new typeパターンを覚えよう