49

C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

  • Upload
    dinhdat

  • View
    238

  • Download
    8

Embed Size (px)

Citation preview

Page 1: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 2: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 3: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 4: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 5: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 6: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 7: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

http://isocpp.org/std/status

C++冬の時代を乗り越え今まさに空前絶後の

C++バージョンアップブーム

Page 8: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

C++14

auto and decltype(auto) return types

Generic lambdas (一部)

C++17 (予定) Concurrency TS(?)

Resumable functions and await (一部)

C#のasync/awaitを意識

Page 9: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 10: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

1つプロセス内の処理

複数プロセス間の処理

他リソース間の処理

非同期処理

レスポンスタイムの向上→「待たない」並行処理

マルチスレッドの効率的利用→並列処理

スループット向上

ex)ディスクアクセスの間に、CPUを利用する

レスポンスタイムの向上

ex)DBからデータを取得するなど、「非同期」でよく使われる例はこれ

Page 11: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

1つプロセス内の処理

複数プロセス間の処理

他リソース間の処理

非同期処理

レスポンスタイムの向上→「待たない」並行処理

マルチスレッドの効率的利用→並列処理

スループット向上

ex)ディスクアクセスの間に、CPUを利用する

レスポンスタイムの向上

ex)DBからデータを取得するなど、「非同期」でよく使われる例はこれ

本日は、用語をこう定義して進めます1 → 非同期処理

2 → 並列高速演算

Page 12: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 13: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 14: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 15: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

プロジェクト例

種類 機能の例

非同期処理

C++C++11

<future>

std::thread / std::promise

std::async

VC++

Windows

Runtime

C++/CX

ppltasks.hconcurrency::task

並列高速演算

DirectX

(GPGPU利用)

C++AMP

amp.hconcurrency::parallel_for_each

Page 16: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 17: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

stdio.h

Page 18: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 19: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 20: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

cout “Hello World!” endl

Page 21: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

auto

cout “Hello World!” endl

// 代入されたラムダを関数呼び出し

Page 22: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

[ ]( std::string const &str ) // 引数

{ std::cout << str << std::endl; } // コード

( “Hello World!” ); // 呼び出し

Page 23: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

auto auto auto

return

plus( std::string( "Hello “ ), std::string( "World“ ));

Page 24: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 25: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 26: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

#include "stdafx.h“#include <iostream>#include <ppltasks.h> // <future>でもOK

int main( ){

int num = 0;concurency::task<int>t01([ &num ](){ // taskで別タスク実行++ num;return( num ); // 非同期処理で返すものを設定

});int result = t01.get(); // 同期を取るreturn( 0 );

}

std::asyncと同じ形

Page 27: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

concurency:: <int

concurency::

concurency::

型は合わせること

.then で返り値を別のタスクに渡す

どんどんつなげることが可能

Page 28: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

concurency::task<int> t([](){

return( 1 );

}).then([](int n){

return( ++n );

}).then([](int n){

return( ++n );

})

そういえばC#でも似たような書き方出来ましたね

Page 29: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 30: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

http://aka.ms/Icp591

Page 31: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 32: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

#include <future>#include <pplawait.h>concurrency::task<void> my_proc(void) __resumable{

auto x = []() __resumable -> concurrency::task<void>{

std::cout << “abc." << std::endl;};__await x();std::cout << “def." << std::endl;

}int main() {

auto task = my_proc();task.wait();

}

Page 33: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 34: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 35: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

void App1::MainPage::my_btn_click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e){task<StorageFile^>(KnownFolders::DocumentsLibrary->CreateFileAsync(my_txt->Text,CreationCollisionOption::ReplaceExisting)

).then([this](StorageFile^ file){

my_btn_01->Content = "ファイル作成しました";});

}

Page 36: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

concurrency::task<void>App1::MainPage::my_btn_click(

Platform::Object^ sender,

Windows::UI::Xaml::RoutedEventArgs^ e)__resumable

{

auto file = __await file->CreateFileAsync(

my_txt->Text,

CreationCollisionOption::ReplaceExisting);

my_btn_01->Content = "ファイル作成しました";

}

Page 37: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

App container ( package manifest )

UI

controls

( XAML )

相互互換のためのC++言語拡張機能(中間の変換無し)

C++実装Class

(ネイティブ)VSプロジェクトテンプレート

C++/CX

Page 38: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

concurrency::create_async

App container ( package manifest )

UI controls

( XAML )C++/CX

C++実装クラス(ネイティブ)

Windows::Foundation::IAsyncActionなど

concurrency::task他のWindows

Runtimeと非同期通信

Page 39: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

処理 利用クラス/アルゴリズム/メソッド

非同期タスク処理 concurrency::task

並列に分割した処理のグルーピング

concurrency::task_group

concurrency::structured_task_group

タスク処理の継続 concurrency::task::then

Page 40: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

非同期アクション IAsyncAction

非同期進行状況 IAsyncActionWithProgress<TProgress>

結果を返す非同期 IAsyncOperation<TResult>

結果も返すし進行も判る

IAsyncOperationWithProgress<TResult,

TProgress>

Page 41: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

処理 利用クラス

非同期タスク処理 concurrency::create_async

Page 42: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 43: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 44: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

この場合の.thenは、UIスレッドに返している

別のスレッドプールを指定することも出来る

Page 45: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 46: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 47: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 48: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency
Page 49: C++/CX非同期まとめjyurimaru.info/data/20140510AsyncVshtc/20140510C... ·  · 2014-05-10C++14 auto and decltype(auto) return types Generic lambdas (一部) C++17 (予定)Concurrency

http://msdn.microsoft.com/ja-jp/library/windows/apps/jj160321.aspx

http://msdn.microsoft.com/ja-jp/library/windows/apps/hh750082.aspx

http://www.aerospace.sd.tmu.ac.jp/hydrodynamics/main/colums/AMPindex.html

http://code.msdn.microsoft.com/windowsapps/Windows-8-Asynchronous-08009a0d