Slide 1

Slide 1 text

Rustでマルチスレッドプログラミング! 〜リアルタイム通信ではどのようにスレッドを立てるのか〜 Rust.Tokyo 2024 NTTコミュニケーションズ 株式会社 内田 裕貴

Slide 2

Slide 2 text

内田 裕貴(Ucchy) X: @yuki_wtz NTTコミュニケーションズに2019年に新卒入社 WebRTC Platform SkyWayでResearchエンジニア Rustでメディアをリアルタイムにやり取りするプロトコルを実装(moq-wasm) IETFの相互接続試験に持ち込んで標準化貢献

Slide 3

Slide 3 text

セッションで話すこと(20分) マルチスレッドの必要性 ~Media over QUIC Transportを例に~ Rustでスレッドを立ててみる ~マルチスレッド化とメッセージのやり取り~ マルチスレッドの難しさとまとめ ~本セッションのコードの振り返り~

Slide 4

Slide 4 text

マルチスレッドの必要性 ~Media over QUIC Transportを例に~

Slide 5

Slide 5 text

Media over QUIC Transport(MoQT)とは

Slide 6

Slide 6 text

Media over QUIC Transport(MoQT)とは QUICをベースとしたリアルタイム通信のためのプロトコル 主に映像や音声などのサイズの大きいメディアを送受信できるように仕様が策定 されている

Slide 7

Slide 7 text

Media over QUIC Transport(MoQT)とは https://datatracker.ietf.org/meeting/interim-2023-moq-08/session/moq QUICをベースとしたリアルタイム通信のためのプロトコル 主に映像や音声などのサイズの大きいメディアを送受信できるように仕様が策定 されている

Slide 8

Slide 8 text

Media over QUIC Transport(MoQT)とは https://datatracker.ietf.org/meeting/interim-2023-moq-08/session/moq QUICをベースとしたリアルタイム通信のためのプロトコル 主に映像や音声などのサイズの大きいメディアを送受信できるように仕様が策定 されている 具体的なユースケースはビデオ会議・ライブ配信

Slide 9

Slide 9 text

Media over QUIC Transport(MoQT)とは 今のビデオ会議やライブ配信ではダメなのか?

Slide 10

Slide 10 text

Media over QUIC Transport(MoQT)とは 今のビデオ会議やライブ配信ではダメなのか? 現在では、ユースケースによってプロトコルを使い分けている ビデオ会議 WebRTC: 超低遅延志向なプロトコル ライブ配信 HLS: 高品質志向なプロトコル

Slide 11

Slide 11 text

Media over QUIC Transport(MoQT)とは 今のビデオ会議やライブ配信ではダメなのか? 現在では、ユースケースによってプロトコルを使い分けている ビデオ会議 WebRTC: 超低遅延志向なプロトコル ライブ配信 HLS: 高品質志向なプロトコル この二つのプロトコルでは遅延と品質のトレードオフを選択できない

Slide 12

Slide 12 text

Media over QUIC Transport(MoQT)とは 今のビデオ会議やライブ配信ではダメなのか? 現在では、ユースケースによってプロトコルを使い分けている ビデオ会議 WebRTC: 超低遅延志向なプロトコル ライブ配信 HLS: 高品質志向なプロトコル この二つのプロトコルでは遅延と品質のトレードオフを選択できない Media over QUIC Transportはこれらのプロトコルの両取りを目指す

Slide 13

Slide 13 text

Media over QUIC Transport(MoQT)の難しさと マルチスレッドの必要性

Slide 14

Slide 14 text

Media over QUIC Transport(MoQT)の難しさと マルチスレッドの必要性 MoQTは、そのユースケース(ビデオ会議・ライブ配信)からわかるように、 リアルタイムに映像や音声が大量に流れる

Slide 15

Slide 15 text

Media over QUIC Transport(MoQT)の難しさと マルチスレッドの必要性 MoQTは、そのユースケース(ビデオ会議・ライブ配信)からわかるように、 リアルタイムに映像や音声が大量に流れる 映像は200kbpsから10Mbps 音声は32kbpsから256kbps

Slide 16

Slide 16 text

Media over QUIC Transport(MoQT)の難しさと マルチスレッドの必要性 MoQTは、そのユースケース(ビデオ会議・ライブ配信)からわかるように、 リアルタイムに映像や音声が大量に流れる 映像は200kbpsから10Mbps 音声は32kbpsから256kbps ビデオ会議では人数分のメディアが流れて約250kbps*人数分にもなる ライブ配信では4K映像流したりすると10Mbpsにもなる

Slide 17

Slide 17 text

Media over QUIC Transport(MoQT)の難しさと マルチスレッドの必要性 MoQTは、そのユースケース(ビデオ会議・ライブ配信)からわかるように、 リアルタイムに映像や音声が大量に流れる 映像は200kbpsから10Mbps 音声は32kbpsから256kbps ビデオ会議では人数分のメディアが流れて約250kbps*人数分にもなる ライブ配信では4K映像流したりすると10Mbpsにもなる メディアを中継するサーバーには非常に大きな負荷がかかる サーバーがどれだけメディアを捌けるかはサービスのコストに直結する

Slide 18

Slide 18 text

Media over QUIC Transport(MoQT)の難しさと マルチスレッドの必要性 MoQTは、そのユースケース(ビデオ会議・ライブ配信)からわかるように、 リアルタイムに映像や音声が大量に流れる 映像は200kbpsから10Mbps 音声は32kbpsから256kbps ビデオ会議では人数分のメディアが流れて約250kbps*人数分にもなる ライブ配信では4K映像流したりすると10Mbpsにもなる メディアを中継するサーバーには非常に大きな負荷がかかる サーバーがどれだけメディアを捌けるかはサービスのコストに直結する マルチスレッド処理を活用してCPUをフルに使う必要がある

Slide 19

Slide 19 text

Rustでスレッドを立ててみる ~マルチスレッド化とメッセージのやり取り~

Slide 20

Slide 20 text

Rustにおけるスレッド

Slide 21

Slide 21 text

Rustにおけるスレッド スレッドには2種類ある

Slide 22

Slide 22 text

Rustにおけるスレッド スレッドには2種類ある OSスレッド(std::threadなど) グリーンスレッド (tokio::spawnなど)

Slide 23

Slide 23 text

OSスレッド グリーンスレッド Rustにおけるスレッド スレッドには2種類ある OSスレッド(std::threadなど) グリーンスレッド (tokio::spawnなど)

Slide 24

Slide 24 text

OSスレッド グリーンスレッド CPUコアとスレッドが1:1対応 OSスレッドの上で複数のグリーンスレッドが動作 Rustにおけるスレッド スレッドには2種類ある OSスレッド(std::threadなど) グリーンスレッド (tokio::spawnなど)

Slide 25

Slide 25 text

OSスレッド グリーンスレッド CPUコアとスレッドが1:1対応 OSスレッドの上で複数のグリーンスレッドが動作 OSがスケジューリング ランタイムがスケジューリング Rustにおけるスレッド スレッドには2種類ある OSスレッド(std::threadなど) グリーンスレッド (tokio::spawnなど)

Slide 26

Slide 26 text

OSスレッド グリーンスレッド CPUコアとスレッドが1:1対応 OSスレッドの上で複数のグリーンスレッドが動作 OSがスケジューリング ランタイムがスケジューリング 作成・破棄・コンテキストスイッチが重い 作成・破棄・コンテキストスイッチが軽い Rustにおけるスレッド スレッドには2種類ある OSスレッド(std::threadなど) グリーンスレッド (tokio::spawnなど)

Slide 27

Slide 27 text

Rustにおけるスレッド これらの使い分けは、CPU処理が重いかI/O処理が重いか

Slide 28

Slide 28 text

Rustにおけるスレッド これらの使い分けは、CPU処理が重いかI/O処理が重いか 映像のエンコード処理やAI処理をやり続けるような場合 => OSスレッド I/O処理など待ちが多い場合 => グリーンスレッド

Slide 29

Slide 29 text

Rustにおけるスレッド これらの使い分けは、CPU処理が重いかI/O処理が重いか 映像のエンコード処理やAI処理をやり続けるような場合 => OSスレッド I/O処理など待ちが多い場合 => グリーンスレッド Media over QUIC TransportではI/O待ちが多いためグリーンスレッドを多用

Slide 30

Slide 30 text

スレッドを立ててみる

Slide 31

Slide 31 text

スレッドを立ててみる メディアの中継サーバーの処理から、スレッドを分けて処理するのが良い部分を検討

Slide 32

Slide 32 text

スレッドを立ててみる メディアの中継サーバーの処理から、スレッドを分けて処理するのが良い部分を検討 クライアントサーバー間でWebTransportコネクションを貼る WebTransportコネクションの中で、2種類のストリームが開かれ、それぞれ別の メッセージが送信される メッセージの種類に応じて、必要なものは送信者以外のクライアントにメッセー ジを転送する

Slide 33

Slide 33 text

スレッドを立ててみる メディアの中継サーバーの処理から、スレッドを分けて処理するのが良い部分を検討 クライアントサーバー間でWebTransportコネクションを貼る 数百以上のクライアントが接続してくると想定する WebTransportコネクションの中で、2種類のストリームが開かれ、それぞれ別の メッセージが送信される メッセージの種類に応じて、必要なものは送信者以外のクライアントにメッセー ジを転送する

Slide 34

Slide 34 text

スレッドを立ててみる メディアの中継サーバーの処理から、スレッドを分けて処理するのが良い部分を検討 クライアントサーバー間でWebTransportコネクションを貼る 数百以上のクライアントが接続してくると想定する WebTransportコネクションの中で、2種類のストリームが開かれ、それぞれ別の メッセージが送信される 双方向ストリーム: C-Plane用メッセージ メディア情報や配信処理などの制御系メッセージ データは少ない 単方向ストリーム: D-Plane用メッセージ 映像や音声のデータメッセージ メッセージの種類に応じて、必要なものは送信者以外のクライアントにメッセー ジを転送する

Slide 35

Slide 35 text

スレッドを立ててみる メディアの中継サーバーの処理から、スレッドを分けて処理するのが良い部分を検討 クライアントサーバー間でWebTransportコネクションを貼る 数百以上のクライアントが接続してくると想定する WebTransportコネクションの中で、2種類のストリームが開かれ、それぞれ別の メッセージが送信される 双方向ストリーム: C-Plane用メッセージ メディア情報や配信処理などの制御系メッセージ データは少ない 単方向ストリーム: D-Plane用メッセージ 映像や音声のデータメッセージ データメッセージのせいで制御メッセージの処理が詰まるのは避けたい メッセージの種類に応じて、必要なものは送信者以外のクライアントにメッセー ジを転送する

Slide 36

Slide 36 text

スレッドを立ててみる メディアの中継サーバーの処理から、スレッドを分けて処理するのが良い部分を検討 クライアントサーバー間でWebTransportコネクションを貼る 数百以上のクライアントが接続してくると想定する WebTransportコネクションの中で、2種類のストリームが開かれ、それぞれ別の メッセージが送信される 双方向ストリーム: C-Plane用メッセージ メディア情報や配信処理などの制御系メッセージ データは少ない 単方向ストリーム: D-Plane用メッセージ 映像や音声のデータメッセージ データメッセージのせいで制御メッセージの処理が詰まるのは避けたい メッセージの種類に応じて、必要なものは送信者以外のクライアントにメッセー ジを転送する スレッド間でのメッセージのやり取りを行いたい

Slide 37

Slide 37 text

スレッドを立ててみる クライアントサーバー間でWebTransportコネクションを貼る

Slide 38

Slide 38 text

スレッドを立ててみる クライアントサーバー間でWebTransportコネクションを貼る

Slide 39

Slide 39 text

スレッドを立ててみる クライアントサーバー間でWebTransportコネクションを貼る 数百以上のクライアントが接続してくると想定する

Slide 40

Slide 40 text

スレッドを立ててみる クライアントサーバー間でWebTransportコネクションを貼る 数百以上のクライアントが接続してくると想定する connectionごとの処理が完了しなければ次のconnectionを処理できない

Slide 41

Slide 41 text

スレッドを立ててみる クライアントサーバー間でWebTransportコネクションを貼る 数百以上のクライアントが接続してくると想定する connectionごとの処理が完了しなければ次のconnectionを処理できない tokio::spawnによってグリーンスレッドを作成することでawaitを待たず に次のコネクションの処理に移るように

Slide 42

Slide 42 text

スレッドを立ててみる クライアントサーバー間でWebTransportコネクションを貼る 数百以上のクライアントが接続してくると想定する connectionごとの処理が完了しなければ次のconnectionを処理できない tokio::spawnによってグリーンスレッドを作成することでawaitを待たず に次のコネクションの処理に移るように

Slide 43

Slide 43 text

スレッドを立ててみる WebTransportコネクションの中で、2種類のストリームが開かれ、それぞれ別のメッ セージが送信される

Slide 44

Slide 44 text

スレッドを立ててみる WebTransportコネクションの中で、2種類のストリームが開かれ、それぞれ別のメッ セージが送信される

Slide 45

Slide 45 text

スレッドを立ててみる WebTransportコネクションの中で、2種類のストリームが開かれ、それぞれ別のメッ セージが送信される

Slide 46

Slide 46 text

スレッドを立ててみる WebTransportコネクションの中で、2種類のストリームが開かれ、それぞれ別のメッ セージが送信される while文によってloop処理になっているため片方のhandle_関数が動き始めるとも う片方が動かなくなる

Slide 47

Slide 47 text

スレッドを立ててみる WebTransportコネクションの中で、2種類のストリームが開かれ、それぞれ別のメッ セージが送信される while文によってloop処理になっているため片方のhandle_関数が動き始めるとも う片方が動かなくなる これも別スレッドでloopさせるように変更

Slide 48

Slide 48 text

ここまでで立てたスレッド

Slide 49

Slide 49 text

ここまでで立てたスレッド WebTransportコネクションを待ち受け、Streamをそれぞれ別のスレッドで処理

Slide 50

Slide 50 text

スレッドを立ててみる ここまでで、中継サーバーの要件である3つのうち、2つまで完了

Slide 51

Slide 51 text

スレッドを立ててみる ここまでで、中継サーバーの要件である3つのうち、2つまで完了 クライアントサーバー間でWebTransportコネクションを貼る WebTransportコネクションの中で、2種類のストリームが開かれ、それぞれ別 のメッセージが送信される メッセージの種類に応じて、必要なものは送信者以外のクライアントにメッセ ージを転送する

Slide 52

Slide 52 text

スレッドを立ててみる ここまでで、中継サーバーの要件である3つのうち、2つまで完了 クライアントサーバー間でWebTransportコネクションを貼る WebTransportコネクションの中で、2種類のストリームが開かれ、それぞれ別 のメッセージが送信される メッセージの種類に応じて、必要なものは送信者以外のクライアントにメッセ ージを転送する

Slide 53

Slide 53 text

ここまでで、中継サーバーの要件である3つのうち、2つまで完了 クライアントサーバー間でWebTransportコネクションを貼る WebTransportコネクションの中で、2種類のストリームが開かれ、それぞれ別 のメッセージが送信される メッセージの種類に応じて、必要なものは送信者以外のクライアントにメッセ ージを転送する スレッドを立ててみる

Slide 54

Slide 54 text

ここまでで、中継サーバーの要件である3つのうち、2つまで完了 クライアントサーバー間でWebTransportコネクションを貼る WebTransportコネクションの中で、2種類のストリームが開かれ、それぞれ別 のメッセージが送信される メッセージの種類に応じて、必要なものは送信者以外のクライアントにメッセ ージを転送する スレッドを立ててみる

Slide 55

Slide 55 text

ここまでで、中継サーバーの要件である3つのうち、2つまで完了 クライアントサーバー間でWebTransportコネクションを貼る WebTransportコネクションの中で、2種類のストリームが開かれ、それぞれ別 のメッセージが送信される メッセージの種類に応じて、必要なものは送信者以外のクライアントにメッセ ージを転送する スレッドを立ててみる メッセージを受け取り、別のクライ アントの双方向ストリームを使って 送信したい

Slide 56

Slide 56 text

チャネルを使ってスレッド間通信 スレッド間でデータをやり取りして処理を行うために、Rustのtokioなどはチャネ ルという概念を用意されている

Slide 57

Slide 57 text

チャネルを使ってスレッド間通信 スレッド間でデータをやり取りして処理を行うために、Rustのtokioなどはチャネ ルという概念を用意されている スレッド間でメッセージを送信するためのパターンであり、 senderとreceiverのペアで構成される

Slide 58

Slide 58 text

スレッド間でデータをやり取りして処理を行うために、Rustのtokioなどはチャネ ルという概念を用意されている スレッド間でメッセージを送信するためのパターンであり、 senderとreceiverのペアで構成される sender / receiverはそれぞれ複数ある場合も 1対1: tokio::sync::oneshot N対1: tokio::sync::mpsc チャネルを使ってスレッド間通信

Slide 59

Slide 59 text

スレッド間でデータをやり取りして処理を行うために、Rustのtokioなどはチャネ ルという概念を用意されている スレッド間でメッセージを送信するためのパターンであり、 senderとreceiverのペアで構成される sender / receiverはそれぞれ複数ある場合も 1対1: tokio::sync::oneshot N対1: tokio::sync::mpsc チャネルを使ってスレッド間通信

Slide 60

Slide 60 text

チャネルを使ってスレッド間通信 スレッド間通信を実現するためにmpscが利用可能

Slide 61

Slide 61 text

チャネルを使ってスレッド間通信 スレッド間通信を実現するためにmpscが利用可能 スレッドAとスレッドBで通信する際には、senderとreceicerをそれぞれのスレッド に渡してあげれば良い

Slide 62

Slide 62 text

チャネルを使ってスレッド間通信 スレッド間通信を実現するためにmpscが利用可能 スレッドAとスレッドBで通信する際には、senderとreceicerをそれぞれのスレッド に渡してあげれば良い しかし、スレッドが増えてくると問題が発生する

Slide 63

Slide 63 text

チャネルを使ってスレッド間通信 スレッド間通信を実現するためにmpscが利用可能 スレッドAとスレッドBで通信する際には、senderとreceicerをそれぞれのスレッド に渡してあげれば良い しかし、スレッドが増えてくると問題が発生する

Slide 64

Slide 64 text

スレッド間通信を実現するためにmpscが利用可能 スレッドAとスレッドBで通信する際には、senderとreceicerをそれぞれのスレッド に渡してあげれば良い しかし、スレッドが増えてくると問題が発生する コミュニケーションパスが爆発する N*(N-1) チャネルを使ってスレッド間通信

Slide 65

Slide 65 text

スレッド間通信を実現するためにmpscが利用可能 スレッドAとスレッドBで通信する際には、senderとreceicerをそれぞれのスレッド に渡してあげれば良い しかし、スレッドが増えてくると問題が発生する コミュニケーションパスが爆発する N*(N-1) なので、管理するためのハブを用意する チャネルを使ってスレッド間通信

Slide 66

Slide 66 text

send_streamを管理するdispatcherを定義 チャネルを使ってスレッド間通信

Slide 67

Slide 67 text

send_streamを管理するdispatcherを定義 双方向ストリームが初期化されるごとに、mpscのsenderを登録し、必要になった らそれを使って送信する チャネルを使ってスレッド間通信

Slide 68

Slide 68 text

send_streamを管理するdispatcherを定義 双方向ストリームが初期化されるごとに、mpscのsenderを登録し、必要になった らそれを使って送信する チャネルを使ってスレッド間通信

Slide 69

Slide 69 text

send_streamを管理するdispatcherを定義 双方向ストリームが初期化されるごとに、mpscのsenderを登録し、必要になった らそれを使って送信する このdispatcherはWebTransportコネクションの中で双方向ストリームが開く たびに追加されるため、一番最初に初期化しておく チャネルを使ってスレッド間通信

Slide 70

Slide 70 text

send_streamを管理するdispatcherを定義 双方向ストリームが初期化されるごとに、mpscのsenderを登録し、必要になった らそれを使って送信する このdispatcherはWebTransportコネクションの中で双方向ストリームが開く たびに追加されるため、一番最初に初期化しておく handle_connectionの中でdispatcherへの登録と受け取り処理を実装 チャネルを使ってスレッド間通信

Slide 71

Slide 71 text

send_streamを管理するdispatcherを定義 双方向ストリームが初期化されるごとに、mpscのsenderを登録し、必要になった らそれを使って送信する このdispatcherはWebTransportコネクションの中で双方向ストリームが開く たびに追加されるため、一番最初に初期化しておく handle_connectionの中でdispatcherへの登録と受け取り処理を実装 チャネルを使ってスレッド間通信

Slide 72

Slide 72 text

send_streamを管理するdispatcherを定義 双方向ストリームが初期化されるごとに、mpscのsenderを登録し、必要になった らそれを使って送信する このdispatcherはWebTransportコネクションの中で双方向ストリームが開く たびに追加されるため、一番最初に初期化しておく handle_connectionの中でdispatcherへの登録と受け取り処理を実装 チャネルを使ってスレッド間通信

Slide 73

Slide 73 text

send_streamを管理するdispatcherを定義 双方向ストリームが初期化されるごとに、mpscのsenderを登録し、必要になった らそれを使って送信する このdispatcherはWebTransportコネクションの中で双方向ストリームが開く たびに追加されるため、一番最初に初期化しておく handle_connectionの中でdispatcherへの登録と受け取り処理を実装 チャネルを使ってスレッド間通信

Slide 74

Slide 74 text

チャネルを使ってスレッド間通信 最終的にはマルチスレッドで以下のような形で処理

Slide 75

Slide 75 text

チャネルを使ってスレッド間通信 最終的にはマルチスレッドで以下のような形で処理

Slide 76

Slide 76 text

チャネルを使ってスレッド間通信 最終的にはマルチスレッドで以下のような形で処理 ①クライアントからメッセージを受け取る

Slide 77

Slide 77 text

チャネルを使ってスレッド間通信 最終的にはマルチスレッドで以下のような形で処理 ①クライアントからメッセージを受け取る ②マネージャースレッドにmpsc経由でメッセー ジを送り、送りたいクライアントが動作している スレッドへのSenderを入手する

Slide 78

Slide 78 text

チャネルを使ってスレッド間通信 最終的にはマルチスレッドで以下のような形で処理 ①クライアントからメッセージを受け取る ②マネージャースレッドにmpsc経由でメッセー ジを送り、送りたいクライアントが動作している スレッドへのSenderを入手する ③Receiverから受け取ったメッセージをクライア ントに送信する

Slide 79

Slide 79 text

マルチスレッドの難しさとまとめ ~本セッションのコードの振り返り~

Slide 80

Slide 80 text

マルチスレッドの難しさ スレッドを立てて個別の処理をすることは簡単

Slide 81

Slide 81 text

マルチスレッドの難しさ スレッドを立てて個別の処理をすることは簡単 その処理の特性(CPU heavyかI/O heavy)でOSスレッド・グリーンスレッド の使い分けは必要

Slide 82

Slide 82 text

マルチスレッドの難しさ スレッドを立てて個別の処理をすることは簡単 その処理の特性(CPU heavyかI/O heavy)でOSスレッド・グリーンスレッド の使い分けは必要 複数スレッドから参照するデータをどう扱うか?が難しい

Slide 83

Slide 83 text

マルチスレッドの難しさ スレッドを立てて個別の処理をすることは簡単 その処理の特性(CPU heavyかI/O heavy)でOSスレッド・グリーンスレッド の使い分けは必要 複数スレッドから参照するデータをどう扱うか?が難しい 管理スレッドを立ててmpscでやり取りする Mutexで複数スレッドから操作できるようにする

Slide 84

Slide 84 text

マルチスレッドの難しさ スレッドを立てて個別の処理をすることは簡単 その処理の特性(CPU heavyかI/O heavy)でOSスレッド・グリーンスレッド の使い分けは必要 複数スレッドから参照するデータをどう扱うか?が難しい 管理スレッドを立ててmpscでやり取りする デッドロックは起きないがmpscの管理が複雑 Mutexで複数スレッドから操作できるようにする

Slide 85

Slide 85 text

マルチスレッドの難しさ スレッドを立てて個別の処理をすることは簡単 その処理の特性(CPU heavyかI/O heavy)でOSスレッド・グリーンスレッド の使い分けは必要 複数スレッドから参照するデータをどう扱うか?が難しい 管理スレッドを立ててmpscでやり取りする デッドロックは起きないがmpscの管理が複雑 Mutexで複数スレッドから操作できるようにする デッドロックのリスク

Slide 86

Slide 86 text

マルチスレッドの難しさ スレッドを立てて個別の処理をすることは簡単 その処理の特性(CPU heavyかI/O heavy)でOSスレッド・グリーンスレッド の使い分けは必要 複数スレッドから参照するデータをどう扱うか?が難しい 管理スレッドを立ててmpscでやり取りする デッドロックは起きないがmpscの管理が複雑 Mutexで複数スレッドから操作できるようにする デッドロックのリスク スレッドで行われる処理や扱うデータのサイズなどを考慮して設計する必要が ある

Slide 87

Slide 87 text

マルチスレッドの難しさ スレッドを立てて個別の処理をすることは簡単 その処理の特性(CPU heavyかI/O heavy)でOSスレッド・グリーンスレッド の使い分けは必要 複数スレッドから参照するデータをどう扱うか?が難しい 管理スレッドを立ててmpscでやり取りする デッドロックは起きないがmpscの管理が複雑 Mutexで複数スレッドから操作できるようにする デッドロックのリスク スレッドで行われる処理や扱うデータのサイズなどを考慮して設計する必要が ある 今回はマネージャー用のスレッドを立てたが負荷が偏ったら複数スレッドか ら操作できるようにMutex化するなどもありうる

Slide 88

Slide 88 text

終わり X: @yuki_wtz (Follow me!)