1 / 67

VC++ まわりの非同期処理

VC++ まわりの非同期処理. ~ VC++ と C++/CX について~ CommunityOpenDay2014 2014/3/22 Sat Room metro 大阪 遥佐保. はじめに. 自己紹介. @ hr_sao Microsoft MVP for Client Development 出没コミュニティ Room metro C++ テンプレート完全ガイド読書会. 本日 の 目的. VisualStudio2013 特に VC++ の 非同期処理関連につい て 理解度 を深める. Topics. 非同期って何よ ? プロセス / スレッド

Download Presentation

VC++ まわりの非同期処理

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. VC++まわりの非同期処理 ~VC++とC++/CXについて~ CommunityOpenDay2014 2014/3/22 Sat Room metro大阪遥佐保

  2. はじめに

  3. 自己紹介 @hr_sao Microsoft MVP for Client Development 出没コミュニティ Room metro C++テンプレート完全ガイド読書会

  4. 本日の目的 VisualStudio2013特にVC++の 非同期処理関連について 理解度を深める

  5. Topics 非同期って何よ? プロセス/スレッド VC++非同期処理 C++/CX非同期処理 まとめ おまけ

  6. 1. 非同期って何よ?

  7. 待つか?待たないか? - 待つ時 Webサイトへのアクセス 1. 画面操作 2. データ取得 3. (2.の取得を待ってから) 画面の更新 画面操作 UI ネットワークからデータ取得 Fetch an image from network 同期取得 画面の更新 要求した データの加工

  8. 待つか?待たないか? - 待たない時 (例)イベントドリブン+処理キュー (Ajaxなど) 画面更新 画面操作 1. 画面操作 2. 画面更新 (何も待っていない) 要求した データの加工 ネットワークからデータ取得 Threadpool

  9. 同期処理/非同期処理について

  10. 同期処理 / シングルスレッド 直前の処理が 終わってから 次の処理へ Webサイト 1-1.データ取得 1. ボタン押す 2. UI更新

  11. 非同期処理 Webサイト 1-1 の処理の終了を待たずに2 の処理を行う 1-1.データ取得 1. ボタン押す 2. UI更新 3. …

  12. マルチスレッド 前の処理を待たずに次へ 1-1と1-2は同時に処理 行列計算 1. 行列掛け算 開始 1-1. 1行目演算 1-2. 2行目演算 2. 文字出力 3. 終了

  13. 非同期処理とマルチスレッドの概念 マルチスレッド 非同期処理 前の処理を待たずに次へ 1と1-1は同時に処理 処理待ちキュー 1 1-1 1 1-1 2 2-1 2 2-1 前の処理を待たずに次へ(同時処理かどうかは無関係)

  14. あれ? わたしは「非同期処理」を調べてた 待たないだけじゃないの? 「スレッド」って何でしょうか?

  15. 2. プロセス/スレッド

  16. 非同期処理を理解するために、 遠回りに見えますが プロセスやスレッドの仕組みについて 紹介します (例はWindowsOS)

  17. プロセスについて

  18. プロセス (1) →アプリの実行単位 CPU/メモリなどリソース割り当ての単位 (≒タスクby Windows) Windowsは マルチプロセス マルチタスク などで表現されている ことが多い

  19. プロセス (2) アプリケーション実行時のプロセスの動き 実行する前に、メモリ内に領域を確保 プロセスが持つもの(アプリの管理情報)    実行イメージ アプリが使うメモリ情報    アプリが使うCPUの情報 メモリ空間 A.exe用 メモリ確保 A.exe 起動

  20. プロセス (3) 異なるプロセス間ではリソースを共有しない プロセスA プロセスB A用メモリ空間 B用メモリ空間 プロセス間通信の仕組みで、実際には情報のやりとりは可能 メモリ 共有しない

  21. スレッドについて

  22. (番外編) スレッドがプロセスで実装 言語VMでスレッド制御 などもある スレッド プロセスの内部の処理単位 →プロセス自身のメモリをスレッド間で共有している プロセスA スレッド1 メモリ スレッド2 スレッド3 メモリ 共有可能

  23. スレッドは処理の流れ スレッドとは、処理の一連の流れ CPU利用の単位となる (参考)第2回 実行メカニズムの理解に欠かせない「スレッド」の概念http://itpro.nikkeibp.co.jp/article/COLUMN/20070416/268374/ プロセスA スレッド1 スレッド2 …

  24. 同時に処理するということ

  25. シングルスレッド スレッドの 処理の流れは1つ 1プロセス、1スレッド = シングルスレッドのプロセス プロセスA スレッド1 JavaScriptはシングルスレッドだけど非同期実装可能

  26. マルチスレッド (1) 複数スレッドは 同時に並列して処理が可能 (マルチコアの場合) 1プロセス、複数スレッド = マルチスレッドのプロセス プロセスA スレッド1 スレッド4 スレッド2 スレッド5 スレッド3

  27. マルチスレッド (2) マルチスレッドの処理の流れイメージ プロセスA 時間 スレッド1 スレッド2 スレッド5 スレッド4 スレッド3 プロセス内で共有しているメモリ

  28. どうやって同時に処理するのか ?

  29. 1CPU-NCoreマルチスレッド(マルチコア) CPUの中にスレッドを処理できるCPUを複数入れればよい(コア) → 1CPU / 4core なら、4スレッドを処理可能 CPU Core スレッド1 Coreの数だけ 平行して処理が可能! Core スレッド2 Core スレッド3 Core スレッド4

  30. (余談) 1CPU シングルCoreだと マルチスレッドは 無理ですか? CPU Core

  31. 1CPU シングルCore マルチスレッド OSが短い間隔で各々のスレッドを切り替えて、疑似的に複数のCPUがあるように振る舞う 複数のスレッドを並列して動作させている(ように見える)→切り替えに処理がかかり、(ry CPU 実際は… Core スレッド1 スレッド2 スレッド3 高速に切り替えてる

  32. 現在では、 シングルCoreのマルチスレッド化 ではなく Core数増加によるマルチスレッド化 の時代に…

  33. 「プロセスやスレッド」の概念は判った で、何なのよ? 非同期処理の話はどうなった?

  34. 非同期処理とマルチスレッドの概念 マルチスレッド (マルチコアの場合) 非同期処理 前の処理を待たずに次へ 1と1-1は同時に処理 処理待ちキュー 1 1-1 1 1-1 2 2-1 2 2-1 前の処理を待たずに次へ(同時処理かどうかは無関係)

  35. 非同期処理とマルチスレッドの目的 マルチスレッド (マルチコアの場合) 非同期処理 並列処理 目的は高速化 処理待ちキュー 1 1-1 1 1-1 2 2-1 2 2-1 並行処理目的は処理の流れを止めないこと

  36. 並列と並行非同期処理の活用

  37. 並列と並行 混同して説明している資料が多い 並列高速化演算処理(ex. GPGPUなどを使う) 非同期処理+並行処理(ex. イベント+処理キュー) 例えば、後者でOSスレッドが使える場合は 並行処理は並列処理として動作が可能になる 並行処理→並列処理に昇格!

  38. 非同期処理の活用例 レスポンスタイムの向上 スループットの向上 マルチスレッドの効率的利用 連載.NETマルチスレッド・プログラミング入門:第1回 マルチスレッドはこんなときに使うhttp://www.atmarkit.co.jp/ait/articles/0503/12/news025.html

  39. 非同期処理の活用例

  40. 3. VC++非同期処理

  41. VC++2013では

  42. C++11 async

  43. C++11のスレッド事情 <thread> std::thread C++11からマルチスレッドがサポートされた少し低レイヤで、結構生々しいコードになる // 従来のC++03までは、各OSに依存したコード // なので、boost::thread などライブラリを利用

  44. std::thread sample #include "stdafx.h“ #include <iostream> #include <future> int main( ){ intnum= 0; std::promise<int> p00; // promise宣言非同期プロバイダ std::thread t00([ &num, &p00 ](){ // thread で別タスクを実行する ++ num; p00.set_value( num); // 非同期処理で返すものを設定 }); std::future<int> f00 = p00.get_future(); // 非同期受取りObj宣言 int result = f00.get(); // タスク処理を待つ(同期を取る) t00.join(); return( 0 ); }

  45. std::async sample threadに比べてasyncはちょっとだけ簡易になった #include "stdafx.h“ #include <iostream> #include <future> int main( ){ intnum= 0; std::future a00([ &num ](){ // asyncで別タスク実行 ++ num; return( num); // 非同期処理で返すものを設定 }); int result = a00.get(); // 同期を取る return( 0 ); }

  46. VC++2012/2013 async

  47. VC++のスレッド事情 <ppltasks.h>using concurrency→PPL:ParallelPatterns Library(MS提供) VC++で用意されている非同期処理含めた並列処理は concurrency という名前空間にまとめられている タスクの並列処理(そのために、スレッドも利用) 並列アルゴリズムもある

  48. concurrency::task sample std::asyncと同じ形 #include "stdafx.h“ #include <iostream> #include <ppltasks.h> // <future>でもOK int main( ){ intnum= 0; concurency::task<int>t01([ &num ](){ // taskで別タスク実行 ++ num; return( num); // 非同期処理で返すものを設定 }); int result = t01.get(); // 同期を取る return( 0 ); }

  49. .then()を用いたTask のつなげ方 (1) concurency::task<int> t1([]() {return(1 ); }); concurency::task<int> t2 = t1.then([](intn) { return( ++n );}); concurency::task<int> t3 = t2.then([](intn) {return( ++n );}); intresult = t3.get() // 同期 型は合わせること .then で返り値を別のタスクに渡す どんどんつなげることが可能

  50. .then()を用いたTask のつなげ方 (2) concurency::task<int> t([]() { return( 1 ); }).then([](int n) { return( ++n ); }).then([](int n) { return( ++n ); })

More Related