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

What is std::sync::atomic

What is std::sync::atomic

Rustのstd::sync::atomicの必要性と既に定義された型にトレイトを実装する方法を解説しました。

F0493f5bcb4cc9fdccc54ae3e8ab6bd0?s=128

Kentaro Matsumoto

September 03, 2019
Tweet

More Decks by Kentaro Matsumoto

Other Decks in Programming

Transcript

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

  2. 自己紹介 • 松本健太郎 ◦ @matsu7874 • フォルシア株式会社 ◦ Webエンジニア ◦

    業務でRustを書いている
  3. 目次 • 闇雲にデータを共有すると何が起こるのか • Atomicとは • cmpトレイトを実装した

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

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

  6. シングルスレッドの場合 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 11111111

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

    00000000 00000000 00000000 00000000 00000000 00000000 00000000 読みます!
  8. シングルスレッドの場合 何の問題も無い

  9. マルチスレッドの場合 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 11111111

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

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

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

    11111111 11111111 11111111 11111111 11111111 00000000 00000000 まだ書いていますヽ (`Д´)ノプンプン 読了    は何を    読んだのか
  13. マルチスレッドの場合 • 同じ値への読み書きが同時に発生すると困る事がある • 対応策 ◦ 操作が不可分にする ◦ 同じ値に操作する数を1にする

  14. Atomicとは

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

  16. std::sync::atomic • Atomic型を提供するモジュール ◦ AtomicBool, AtomicIsize, AtomicIsize • Atomic型はSyncトレイトが実装されている ◦

    安全にスレッド間で共有可能 • スレッド間で共有される機能は持っていないのでArcを使う ◦ Arc::new(AtomicUsize::new(0))
  17. Atomic以外の方法はあるの? • Mutex、RWLockがある • それぞれのパフォーマンスは ◦ "Performance Comparison of Mutex,

    RWLock and Atomic types in Rust" というスライドが有名
  18. 比較を実装した

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

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