目次

Rustの勉強[並行性 その7]

ぎじゅつ

はじめに

#

NO IMAGEThe Rust Programming Language 日本語版 - The Rust Programming Language 日本語版
を読んでいる

お勉強

#
  • Arcやった
  • アークって呼んだほうがかっこよさそう
  • 昨日のgoの勉強会で話してて思ったがRustは型で包んで表現することが多いなと思った

メモ

#

なぜ全ての基本型がアトミックでなく、標準ライブラリの型も標準でArc<T>を使って実装されていないのか疑問に思う可能性があります。 その理由は、スレッド安全性が、本当に必要な時だけ支払いたいパフォーマンスの犠牲とともに得られるものだからです。

  • ま、そうっすよねー
use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    let counter = Arc::new(Mutex::new(0));
    let mut handles = vec![];

    for _ in 0..10 {
        let counter = Arc::clone(&counter);
        let handle = thread::spawn(move || {
            let mut num = counter.lock().unwrap();

            *num += 1;
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }

    println!("Result: {}", *counter.lock().unwrap());
}
  • 実装のトレイトが一緒でuseを変えるだけとかそんな感じであろう
  • Rustの気持ちになってきたな

単純な数値演算を行おうとしているなら、Mutex<T>型よりも単純な、 標準ライブラリのstd::sync::atomicモジュールによって提供される型があることに注意してください。

  • 別の型があるのだけ分かった

NO IMAGESyncとSendトレイトで拡張可能な並行性 - The Rust Programming Language 日本語版

  • すげーいっぱいあるじゃん

面白いことに、Rust言語には、寡少な並行性機能があります。

  • 全部これでいいじゃん
    • まぁパフォーマンスがとか言われんだろな

でここまでに語った並行性機能のほとんどは、 標準ライブラリの一部であり、言語ではありません。

  • 言語ではない?

    • 言語に実装されてるわけではないという話か
  • んーなるほど

  • 根本何をやっているかの話か

  • 標準ライブラリなだけで別にtokioみたいなcrateと扱いは変わらず、言語レベルで実装されている物の話をしてるな

  • SendSyncがあるらしい

まとめ

#
  • Arcで安全に並行処理できるよね
  • でも遅くなるよというパフォーマンスの問題
  • なんか当たり前って感じだった

つぎはここ
NO IMAGESyncとSendトレイトで拡張可能な並行性 - The Rust Programming Language 日本語版