or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
 | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Syncing
xxxxxxxxxx
第16回
第16章 恐れるな!並行性
2020/11/25 原山和之
本日やること
スレッドを使用してコードを同時に走らせる
1つのOSスレッドに対して1つの言語スレッドは
プログラミング言語によってスレッドはいくつかの方法で実装されています。多くのOSで、新規スレッドを生成するAPIが提供されています。 言語がOSのAPIを呼び出してスレッドを生成するこのモデルを時に1:1と呼びます。
グリーンスレッド
グリーンスレッドを使用する言語は、それを異なる数のOSスレッドの文脈で実行します。 このため、グリーンスレッドのモデルはM:Nモデルと呼ばれます。
M個のグリーンスレッドに対して、 N個のOSスレッドがあり、MとNは必ずしも同じ数字ではありません。
ランタイムの意味
Rustでは
新規スレッドを生成例
生成結果
joinハンドルで全スレッドの終了を待つ
Joinの結果
スレッドでmoveクロージャを使用する
メッセージ受け渡しを使ってスレッド間でデータを転送する
mpsc::channel関数
やりとり例
チャンネルと所有権の転送
複数の値を送信し、受信側が待機するのを確かめる
転送機をクローンして複数の生成器を作成する
状態共有並行性
ミューテックス
どんな時も1つのスレッドにしかなんらかのデータへのアクセスを許可しないというように、 "mutual exclusion"(相互排他)の省略形です。
ミューテックスにあるデータにアクセスする = ミューテックスのロック
ミューテックスのロック = データを死守する(guarding)
ミューテックスは、2つの規則
Mutex<T>のAPI
複数のスレッド間でMutex<T>を共有する
修正
さらに修正 … Rc<T>使う
Arc<T>で原子的な参照カウント
RefCell<T>/Rc<T>とMutex<T>/Arc<T>の類似性
counterは不変なのに、その内部にある値への可変参照を得ることができたことに気付いたでしょうか; つまり、Mutex<T>は、Cell系のように内部可変性を提供するわけです。 第15章でRefCell<T>を使用してRc<T>の内容を可変化できるようにしたのと同様に、 Mutex<T>を使用してArc<T>の内容を可変化しているのです。
SyncとSendトレイトで拡張可能な並行性