C++11ベースのスレッドプールの概要


  • タイプ取得
  • decltype:
     , , , .
    

    std::result_of
    template<class F, class... Args>
    typename std::result_of(Args...)>::type
  • 匿名関数
  • 匿名関数の形式は、[captures](params)->ret{Statments;}
    Capturesのオプションは次のとおりです.
  • []変数を切り取らない
  • [&]外部作用ドメイン内のすべての変数を切り取り、参照として関数体で
  • を使用する.
  • [=]外部作用ドメイン内のすべての変数を切り取り、関数体で使用する
  • をコピーする.
  • [=,&foo]外部作用ドメイン内のすべての変数を切り取り、関数体で使用する1部をコピーしますが、foo変数には
  • 参照を使用します.
  • [bar]bar変数を切り取り、関数体重で使用する他の変数
  • を切り取らずにコピーする.
  • [this]現在のクラスのthisポインタを切り取ります.すでに&または=を使用している場合は、このオプションをデフォルトで追加します.
  • std::bind

  • バインド(Bind)関数とパラメータの役割は、fnベースの関数オブジェクトを返しますが、呼び出しに必要なパラメータは事前にバインドされています.この関数オブジェクトを呼び出すことは、バインドされたパラメータでfnを呼び出すことに相当する.
    // (1)
    template 
     /*   */ bind (Fn&& fn, Args&&... args);
    // bind  
    #include 
    #include 
    
    //  
    double my_divide (double x, double y) {return x/y;}
    //  
    struct MyPair {
      double a,b;
      double multiply() {return a*b;}
    };
    
    int main () {
      //  using  _1, _2, _3,...
      using namespace std::placeholders;
    
      //  :
      auto fn_five = std::bind (my_divide,10,2); //   10/2
      std::cout << fn_five() << '
    '
    ; // 5 auto fn_half = std::bind (my_divide,_1,2); // x/2 std::cout << fn_half(10) << '
    '
    ; // 5 auto fn_invert = std::bind (my_divide,_2,_1); // y/x std::cout << fn_invert(10,2) << '
    '
    ; // 0.2 auto fn_rounding = std::bind<int> (my_divide,_1,_2); // int(x/y) std::cout << fn_rounding(10,3) << '
    '
    ; // 3 MyPair ten_two {10,2}; // : auto bound_member_fn = std::bind (&MyPair::multiply,_1); // x.multiply() std::cout << bound_member_fn(ten_two) << '
    '
    ; // 20 auto bound_member_data = std::bind (&MyPair::a,ten_two); // ten_two.a std::cout << bound_member_data() << '
    '
    ; // 10 return 0; }

    運転結果:5 5 5 0.2 3 20 10
  • std::future、std::async、std::promise、std::packaged_task