C++/CX非同期まとめ

http://isocpp.org/std/status
C++冬の時代を乗り越え
今まさに空前絶後の
C++バージョンアップ
ブーム
C#のasync/awaitを意識
C++14
auto and decltype(auto) return types
Generic lambdas (一部)
C++17 (予定) Concurrency TS(?)
Resumable functions and await (一部)
1つプロセス内の 複数プロセス間の 他リソース間の
処理
処理
処理
非同期処理
レスポンスタイム
レスポンスタイ
の向上
ムの向上
スループット向上
→「待たない」
並行処理
ex)DBからデータ
ex)ディスクアクセ
を取得するなど、
スの間に、CPUを
マルチスレッドの
「非同期」でよ
利用する
効率的利用
く使われる例は
→並列処理
これ
本日は、用語をこう定義して進めます
1 → 非同期処理
2 → 並列高速演算
1つプロセス内の 複数プロセス間の 他リソース間の
処理
処理
処理
非同期処理
レスポンスタイム
レスポンスタイ
の向上
ムの向上
スループット向上
→「待たない」
並行処理
ex)DBからデータ
ex)ディスクアクセ
を取得するなど、
スの間に、CPUを
マルチスレッドの
「非同期」でよ
利用する
効率的利用
く使われる例は
→並列処理
これ
プロジェクト
種類
例
C++
非同期処理 VC++
Windows
Runtime
並列
高速演算
C++11
<future>
機能の例
std::thread / std::promise
std::async
C++/CX
concurrency::task
ppltasks.h
DirectX
C++AMP
(GPGPU利用) amp.h
concurrency::parallel_for_each
stdio.h
cout
“Hello World!”
endl
auto
cout
“Hello World!”
endl
// 代入されたラムダを関数呼び出し
[ ]( std::string const &str )
// 引数
{ std::cout << str << std::endl; } // コード
( “Hello World!” );
// 呼び出し
auto
return
auto
auto
plus( std::string( "Hello “ ), std::string( "World“ ));
#include "stdafx.h“
#include <iostream>
std::asyncと同じ形
#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 );
}
concurency::
<int
型は合わせること
concurency::
concurency::
.then で返り値を
別のタスクに渡す
どんどんつなげることが
可能
concurency::task<int> t([](){
return( 1 );
}).then([](int n){
return( ++n );
}).then([](int n){
return( ++n );
})
そういえばC#でも
似たような書き方
出来ましたね
http://aka.ms/Icp591
#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();
}
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 = "ファイル作成しました";
});
}
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 = "ファイル作成しました";
}
App container ( package manifest )
UI
controls
( XAML )
相互互換のための
C++言語拡張機能
(中間の変換無し)
VSプロジェクト
テンプレート
C++/CX
C++実装
Class
(ネイティブ)
App container ( package manifest )
UI controls
( XAML )
他の
Windows
Runtimeと
非同期通信
C++/CX
C++実装クラス
(ネイティブ)
concurrency::task
Windows::Foundation::IAsyncActionなど
concurrency::create_async
処理
利用クラス/アルゴリズム/メソッド
非同期タスク処理
concurrency::task
並列に分割した処理の concurrency::task_group
concurrency::structured_task_group
グルーピング
タスク処理の継続
concurrency::task::then
非同期アクション
IAsyncAction
非同期進行状況
IAsyncActionWithProgress<TProgress>
結果を返す非同期
IAsyncOperation<TResult>
結果も返すし進行
も判る
IAsyncOperationWithProgress<TResult,
TProgress>
処理
利用クラス
非同期タスク処理
concurrency::create_async
この場合の.thenは、
UIスレッドに返している
別のスレッドプールを指定する
ことも出来る
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/AMPinde
x.html
http://code.msdn.microsoft.com/windowsapps/Windows-8-Asynchronous08009a0d