Home / ぼやきごと / 2013-03-23 / C++11なコードをとりあえず書いてみただけの記事
C++11なコードをとりあえず書いてみただけの記事

C++11なコードをとりあえず書いてみただけの記事

仕事じゃまだまだ当分 Visual Studio 2008 を使うことになりそうなので、せめて家ではC++11にも触っていかないと…。
というわけでおもむろにC++11なコードを書いてみる。

すべて開くすべて閉じる
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 
 
 
 
 
 
 
 
-
-
!
|
-
|
!
|
-
!
|
-
-
!
|
|
|
|
-
!
|
|
-
!
|
-
!
!
|
-
!
|
-
!
|
-
!
|
-
!
|
|
!
#include <thread>
#include <future>
#include <functional>
#include <random>
#include <iostream>
#include <string>
 
int main()
{
    // スレッドID付きで文字列行を出力する関数オブジェクト作成
    auto printLine =
        [](const std::string& text)
        {
            std::cout << std::this_thread::get_id() << ": " << text << std::endl;
        };
 
    // 非同期処理関数オブジェクト作成
    auto asyncFunc =
        [&printLine]()
        {
            // 1〜10の整数値を返す乱数ジェネレータ構築
            auto rand =
                std::bind(
                    std::uniform_int_distribution<int>(1, 10),
                    std::mt19937(std::random_device()()));
 
            // ランダムな秒数値を取得し、その時間だけスリープ
            auto sec = rand();
            std::this_thread::sleep_for(std::chrono::seconds(sec));
 
            // スレッドID付きで文字列出力
            printLine("Hello, C++11 world.");
 
            // スリープした秒数値を返す
            return sec;
        };
 
    // 非同期処理開始
    auto future = std::async(std::launch::async, std::move(asyncFunc));
 
    // スレッドID付きで文字列出力
    printLine("Hello, C++11 world.");
 
    // 非同期処理の完了を待機し、スリープした秒数を得る
    auto sec = future.get();
 
    // スレッドID付きでスリープ秒数出力
    printLine("Sleep for " + std::to_string(sec) + " seconds.");
 
    return 0;
}

無駄にラムダ式を使ってますが、 asyncFunc みたいな長さの場合はちゃんと関数オブジェクトクラスを定義した方がいいと思います。

書いてみて感じたのは、「std::async すげぇ!」ってことですね。
スレッド内で例外が起きた場合も future.get() を呼び出したスレッドに例外を投げてくれるみたいですし。
::_beginthreadex だとかの環境依存コードを書くしかなかったスレッド処理が一気に身近になった感じです。

ああ、こんな素敵なC++11を早く仕事で使えればいいのに…。

Category: [プログラミング][C++] - 2013-03-23 23:47:35