並行処理 C++
並行処理とは複数タスクの同時実行。
並行処理により、スループットの向上と応答性の向上のが期待できる。
- スループットの向上・・・一つの処理を複数プロセッサで分散実行することによる
- 応答性の向上・・・プログラムがぽ宇藤を待っている間に別の処理を実行できることによる
〇C++の並行処理
- 標準ライブラリによって並行処理がサポートされている
- 標準ライブラリでは単一アドレス空間における複数スレッドの並行実行を直接サポート。
- 具体的には適切なメモリモデルと一連のアトミック処理を提供する。
〇主なライブラリの機能
- thread
- mutex
- lock()
- packaged_task
- future
これらすべての機能は、オペレーティングシステムが提供する機能に直接基づいて作られたものであり、OSよりも性能的に劣ることはない。
〇データの共有
複数のタスクがデータを共有する場合(ファイルへの書き込みとか?)
データへのアクセスを同期させる場合、同時にアクセスするタスクを高々一個に制限する必要がある。
このような場合、mutexが使える。
すなわち相互排他オブジェクトである。
〇サンプルコード
一個のthreadはlock()処理によってmutexを獲得する
mutex m; int share_data; void f() { unique_lock<mutex> lck {m}; // mutexを獲得 share_data += 7; // 共有データを操作 } // 暗黙裏に解放
- unique_lockのコンストラクタが(m.lock()の呼び出しによって)mutexを獲得する。
- ほかのスレッドがそのmutexをすでに獲得していれば他のスレッドが処理を完了するまで待機する(ブロックする)
- あるスレッドが共有データへのアクセスを完了したら、unique_lockは(m.unlock()を呼び出すことで)mutexを開放する
- このような「相互排他」と「ロック機能」は
で定義されている