Slide 1

Slide 1 text

What is std::sync::atomic 2019/09/13 Shinjuku.rs #6 @FORCIA

Slide 2

Slide 2 text

自己紹介 ● 松本健太郎 ○ @matsu7874 ● フォルシア株式会社 ○ Webエンジニア ○ 業務でRustを書いている

Slide 3

Slide 3 text

目次 ● 闇雲にデータを共有すると何が起こるのか ● Atomicとは ● cmpトレイトを実装した

Slide 4

Slide 4 text

スレッド間でデータを共有すると 何が起こるのか

Slide 5

Slide 5 text

メモリの様子を拡大してみると 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

Slide 6

Slide 6 text

シングルスレッドの場合 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 書きます!

Slide 7

Slide 7 text

シングルスレッドの場合 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 読みます!

Slide 8

Slide 8 text

シングルスレッドの場合 何の問題も無い

Slide 9

Slide 9 text

マルチスレッドの場合 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 11111111 11111111 00000000 00000000 00000000 00000000 00000000 00000000 書きます!

Slide 10

Slide 10 text

マルチスレッドの場合 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 11111111 11111111 11111111 11111111 00000000 00000000 00000000 00000000 書いていますよ! 読みます!

Slide 11

Slide 11 text

マルチスレッドの場合 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 11111111 11111111 11111111 11111111 11111111 11111111 00000000 00000000 まだ書いていますヽ (`Д´)ノプンプン 読了

Slide 12

Slide 12 text

マルチスレッドの場合 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 11111111 11111111 11111111 11111111 11111111 11111111 00000000 00000000 まだ書いていますヽ (`Д´)ノプンプン 読了    は何を    読んだのか

Slide 13

Slide 13 text

マルチスレッドの場合 ● 同じ値への読み書きが同時に発生すると困る事がある ● 対応策 ○ 操作が不可分にする ○ 同じ値に操作する数を1にする

Slide 14

Slide 14 text

Atomicとは

Slide 15

Slide 15 text

Atomicとは? ● 書き込み途中に読まれない ● 読み込み途中に書かれない ● アーキテクチャによって強い・弱いがあるらしい

Slide 16

Slide 16 text

std::sync::atomic ● Atomic型を提供するモジュール ○ AtomicBool, AtomicIsize, AtomicIsize ● Atomic型はSyncトレイトが実装されている ○ 安全にスレッド間で共有可能 ● スレッド間で共有される機能は持っていないのでArcを使う ○ Arc::new(AtomicUsize::new(0))

Slide 17

Slide 17 text

Atomic以外の方法はあるの? ● Mutex、RWLockがある ● それぞれのパフォーマンスは ○ "Performance Comparison of Mutex, RWLock and Atomic types in Rust" というスライドが有名

Slide 18

Slide 18 text

比較を実装した

Slide 19

Slide 19 text

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できない。

Slide 20

Slide 20 text

newtypeパターン ● 特に何もせずに新しい型だよって言っちゃう ○ struct Bar(Foo); ○ https://github.com/rust-unofficial/patterns/blob/master/patterns/newtype.md ○ 自分で定義した型になら既にあるtraitが実装できる!

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

まとめ ● スレッド間でデータ共有したい場合はそれ用の型を使う ● Atomicが高速 ● new typeパターンを覚えよう