Slide 1

Slide 1 text

5 分でやる Rust Concurrency in Ac0on @syu_cream

Slide 2

Slide 2 text

わたしはだれ •  @syu_cream – ウェッブサービスの裏側を支える技術者 – 趣味でmrubyの薄い本やC++のコード書いてます

Slide 3

Slide 3 text

今日のお話 •  Rust でマルチスレッドプログラミングするのって •  C++ でやるより楽だよねというはなし •  時間も限られてるし mutex についてのみ •  題材としてスレッド毎にvectorに要素追加してみる –  GitHub に今日話すソースコードあります –  h

Slide 4

Slide 4 text

C++ で書く場合(データ競合起こす版) •  コンパイルは通る – ただし未定義動作になる

Slide 5

Slide 5 text

C++ で書く場合 •  ロックを取ることでデータ競合を避ける

Slide 6

Slide 6 text

Rust で書く場合(データ競合起こす版1) •  コンパイルが…

Slide 7

Slide 7 text

Rust で書く場合(データ競合起こす版1) •  コンパイルが…通らない! – 複数のスレッドに変数をborrowしようとしてるため

Slide 8

Slide 8 text

Rust で書く場合(データ競合起こす版2) •  じゃあ Arc で参照をcloneしてborrowしよう! •  これでコンパイルが…

Slide 9

Slide 9 text

Rust で書く場合(データ競合起こす版2) •  じゃあ Arc で参照をcloneしてborrowしよう! •  これでコンパイルが…通らない! – Arc の変数は複数スレッドから変更できない

Slide 10

Slide 10 text

Rust で書く場合 •  Mutex を使う! – lock() でロックを取って変更する

Slide 11

Slide 11 text

マルチスレッドプログラミングにおける C++ vs Rust •  C++ –  C++11以降ならthread,mutexが標準で使えて便利 –  データ競合についてはプログラマが気をつける必要あり •  Rust –  データ競合が起こる場合コンパイル時にエラーになる

Slide 12

Slide 12 text

Rustでも競合状態は避けきれない •  以下のコードはデッドロックを起こす…

Slide 13

Slide 13 text

まとめ •  Rust でマルチスレッドプログラミングするのって –  コンパイル時のチェックが手厚いので •  C++ でやるより楽だよねというはなし –  ただし万能なわけではないよ