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


#blog2navi()
*C++11なコードをとりあえず書いてみただけの記事 [#j37b1ff2]

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

#code(c){{
#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;
}
}}

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

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

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

RIGHT:Category: &#x5b;[[プログラミング>ぼやきごと/カテゴリ/プログラミング]]&#x5d;&#x5b;[[C++>ぼやきごと/カテゴリ/C++]]&#x5d; - 2013-03-23 23:47:35
----
RIGHT:&blog2trackback();
#comment(above)
#blog2navi()