December 21, 2013

[C++]VisualStudio2013NovCTP:C++17(予定)resumable/await紹介

これは C++ Advent Calendar 2013 の21日目の記事です
  • C++ Advent Calendar 2013
    (リンク切れ)http://partake.in/events/91328710-3c7b-436e-bd4e-4d98d88333f9

わたくし、マイクロソフトのVisualStudioびいきですので
その目線で書かせて頂きます

<Visual Studio 2013 NovCTP について>

VisualStudio2013のC++は、そこそこさくっと動くようになっています
Express版でのGPUデバックも出来るようになっているので、ぜひ使ってみてください
(VS2012では使えなかった)
 
さて2013/12/20 現在、Visual C++ Compiler November 2013 CTP というC++コンパイラが提供されています
CTPとは、Community Technology Preview の略称で、いわゆる評価版のことです
 
cal201302

 
VS2013のダウンロードはこちらから↓↓↓

*Visual Studio 2013 本体ダウンロード
http://www.visualstudio.com/downloads/download-visual-studio-vs

*Visual C++ Compiler November 2013 CTP

http://www.microsoft.com/en-us/download/details.aspx?id=41151 
 
この評価版、結構嬉しいことに、C++14の機能もちょこっと入っています


今のVS2013 と November 2013 CTP との差異は、ミスターSTLこと Stephan がまとめてくれています
Stephan T. Lavavej は、マイクロソフト本社のVSライブラリチームの偉い方です

*C++11/14 Core Language Features in VS 2013 and the Nov 2013 CTP
http://blogs.msdn.com/b/vcblog/archive/2013/12/02/c-11-14-core-language-features-in-vs-2013-and-the-nov-2013-ctp.aspx

cal201303


Nov 2013 CTPで対応したものをここにも抜粋しておきます

C++11
Rvalue references (対応完了)
ref-qualifiers
constexpr (一部) 
Alignment
Inheriting constructors
Defaulted and deleted functions (対応完了)
Extended sizeof
noexcept (一部) 

C++11 Concurrency
Magic statics

C++11 C99
__func__ (対応完了)

C++14
auto and decltype(auto) return types
Generic lambdas (一部)

C++17 (予定)  Concurrency TS (おそらく)
Resumable functions and await (一部)

とりあえず、November 2013 CTP版はこんな背景です
では、さっそく使ってみましょう


<コンパイラの切り替え>

まずはここ大事です!
選択するソリューションは、なんでも良いです
馴染みのある WIn32 コンソールアプリケーションでやってみます

プラットフォームツールセットを Visual C++ Compiler Nov 2013 CTP (CTP_Nov2013) に選択しておきます

cal201300



<非同期処理 resumable / await>

さてさて、VC++にとっては突如現れた感満載の resumable / await を取り上げてみたいと思います
これ、非同期処理を C# の async / await 風に書けるやつです
なんという対応の早さ
マイクロソフトさま、すばらっしい

これでもう C#なんかうらやましくないもんね
LINQ ?そういやそんなんありましたね

そうです!同じことが C++でも書けます

ネストされたコールバック?もう要らないですよ〜ヽ(`▽´)/
とはいえ、2013/12/20時点では、まだ await 記述は書けない
※2012/12/21追記
 επιστημηさんに指摘頂きました、現時点でもawait記載可能です!!
 えぴさん、指摘をありがとうございますm(__)m 

やはり、VC++でWindowsストアアプリが記述できるので、C#との対比を意識しているんでしょうね

実際のコードはこちら

 1 // ===============================================
 2 // メイン処理での非同期読み込み
 3 // ===============================================
 4 std::cout << "===非同期読み込み開始===" << std::endl;
 5 my_file_read_async(file_name).then([](){
 6     std::cout << "===非同期読み込み完了===" << std::endl;
 7 });
 8 std::cout << "===非同期読み込み通過===" << std::endl;
 9 
10 std::cout << "===終わり===" << std::endl;
11 
12 // ===============================================
13 // 非同期読み込み
14 // ===============================================
15 concurrency::task<void> my_file_read_async(std::string f_name) __resumable
16 {
17     std::ifstream   ifs( f_name );
18     std::string     buff;
19 
20     while( ifs && std::getline( ifs, buff )){
21         std::cout << buff << std::endl;
22     }
23 }


なんてことなし
__resumable で非同期処理宣言
受け手は __await なんですけど、まだ nov 2013CTP では未実装
※2012/12/21追記 
 実装されています
 awaitでの実装版は、επιστημηさんがこちら(Qiita)に記載されています

まー C# の async/await にそっくりです
この時期に、この機能を入れてくるのは
VCチームのやる気が伝わってくる感じですね


今回作ってみたコンソールプログラムの全てはこちらです

*ConsoleApplication1.cpp

 1 // ConsoleApplication1.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
 2 //
 3 
 4 #include "stdafx.h"
 5 
 6 // 追加のincludeファイル
 7 #include <iostream>
 8 #include <ppltasks.h>
 9 #include <pplawait.h>
10 #include <string>
11 #include <fstream>
12 
13 // ===============================================
14 // プロトタイプ宣言
15 // ===============================================
16 void my_file_read(std::string f_name);
17 concurrency::task<void> my_file_read_async(std::string f_name) __resumable;
18 
19 // ===============================================
20 // メイン処理
21 // ===============================================
22 int _tmain(int argc, _TCHAR* argv[])
23 {
24     std::string file_name = "C:\\Users\\Sao\\Desktop\\sao.txt";
25 
26     // 同期読み込み
27     std::cout << "===同期読み込み開始===" << std::endl;
28     my_file_read( file_name );
29     std::cout << "===同期読み込み終わり===" << std::endl;
30 
31     // 非同期読み込み
32     std::cout << "===非同期読み込み開始===" << std::endl;
33     my_file_read_async(file_name).then([](){
34         std::cout << "===非同期読み込み完了===" << std::endl;
35     });
36     std::cout << "===非同期読み込み通過===" << std::endl;
37 
38     std::cout << "===終わり===" << std::endl;
39 
40     return 0;
41 }
42 
43 // ===============================================
44 // 同期読み込み
45 // ===============================================
46 void my_file_read(std::string f_name)
47 {
48     std::ifstream   ifs( f_name );
49     std::string     buff;
50 
51     while( ifs && std::getline( ifs, buff )){
52         std::cout << buff << std::endl;
53     }
54 }
55 
56 // ===============================================
57 // 非同期読み込み
58 // ===============================================
59 concurrency::task<void> my_file_read_async(std::string f_name) __resumable
60 {
61 
    
my_file_read( file_name );
62 }
63 
64 // ===============================================
65 // End of file


このプログラムは、よく見ると34行目の非同期読み込み完了の出力文字と

34     std::cout << "===非同期読み込み完了===" << std::endl;

38行目の終わりの出力と

38 
    std::cout << "===終わり===" << std::endl;

があります
38行目の "===終わり===" が表示される前に
果たして、"===非同期読み込み完了===" は表示されるんでしょうか??
 
ちょっと動かしてみたら、いかにも非同期処理っぽい結果になりました

cal201301


見た通りではありますが
非同期に関して何も処理をしていないまま
出力だけをさせているので

なんらかのタイミングによって
非同期処理の完了タイミングも不定になるみたいです(当然)

例によって何てことないプログラムですが、プロジェクトファイルをまるっとここに置いておきます
(わたしは Visual Studio2013を利用しています)

http://jyurimaru.info/data/20131220Blog/20131220BlogConsoleApplication1.zip

さて、続きはC++ Advent Calendar 2013 の22日目の@fadis_ さんにバトンタッチ


参考サイト
*Announcing the Visual C++ Compiler November 2013 CTP
VC++チームブログのCTP紹介( resumable / await リリース宣言)


haruka_sao at 17:40コメント(1)C++ | プログラミング 

コメント一覧

1. Posted by 道化師   December 23, 2013 19:15
コマンドラインからNov2013CTPを利用する為のカスタム vcvarsall.bat を書き起こしました!
https://bitbucket.org/wraith13/vcvarsall-for-vc2013-ctp

コメントする

名前:
URL:
  情報を記憶: 評価:  顔   星
 
 
 
Sao's Tech Memo
mvp_logo_140

Microsoft MVP for Developer Technologies
[Jul,2018-Jun,2022]
Microsoft MVP for Windows Development
[Jan,2016-Dec,2018]
Microsoft MVP for Windows
Platform Development
[Jan,2015-Dec,2015]
Microsoft MVP for
Client Development
[Jan,2014-Dec,2014]
Microsoft MVP for Client App Dev [Jan,2010-Dec,2013]
Recent Comments
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

記事検索