如何使用包含std :: vector std :: thread的struct类型正确初始化std :: vector

时间:2016-03-20 02:19:55

标签: c++ multithreading c++11 vector

这是我的代码的一个小例子,如何在构造函数中正确初始化成员pool_。

#include <vector>
#include <thread>
#include <iostream>

namespace b {

class A;
typedef void (A::*Func) (void);

struct c {
  Func fun;
  int num;
  std::vector<std::thread> threads;
};

class A {
 public:
  A() {
    pool_ = {{&A::func1, 1, }, {&A::func2, 2, }}; // how to initialize?
  }
 private:
  std::vector<c> pool_;
  void func1(void) { std::cout << "func1\n"; };
  void func2(void) { std::cout << "func2\n"; };
  void CreateThread(c& pool) {
    for (int i = 0; i < pool.num; ++i) {
      pool.threads.push_back(std::thread(pool.fun, this));
    }
  }
};

} // namespace b

int main() {
  b::A a;
  return 0;
}

平台:Ubuntu 14.04 with g ++ 4.8.4

编译命令:

g++ -Wall -std=c++11 test.cc -lpthread -o test

主要错误信息是:

error: use of deleted function ‘std::thread::thread(std::thread&)’

我知道这是因为不允许复制构造和std :: thread的赋值。但我尝试了其他方法并失败了。

1 个答案:

答案 0 :(得分:2)

优雅地解决这个问题的两个步骤:

  1. 为c提供了一个构造函数,它可以做正确的事情&#39;
  2. struct c {
        c(Func fun, int num, std::vector<std::thread> threads = {})
        : fun(fun)
        , num(num)
        , threads(std::move(threads))
        {}
    
        Func fun;
        int num;
        std::vector<std::thread> threads;
    };
    
    1. 然后将您的对象整齐地放入pool_

      A()
      {
          pool_.emplace_back(&A::func1, 1);
          pool_.emplace_back(&A::func2, 2);
      }