std :: generate_n算法需要复制ctor。如何在下面的代码中避免这种情况?

时间:2015-09-30 15:07:43

标签: c++ atomic stl-algorithm

    std::vector<std::thread> thread_pool;
    ...
    std::generate_n(std::back_inserter(thread_pool), cpu_cores,
                    [] (){
        //...
        return std::thread{worker(worker_name) };
    } );

其中:

  class worker {
      std::atomic_bool done;
  protected:
      void operator()() {
          while(!done) {
 //   some work
          }
   }
   public:
   worker(const std::string& worker_name)
       : done(false) {
        // some initialization 
    }
 // other fields
 };


  error: use of deleted function 'std::atomic_bool::atomic_bool(const std::atomic_bool&)'

GCC 4.9

因为我看到原子无法复制,只是被移动了。 上面的代码需要复制some_object类的ctor。 怎么解决这个?

(可能设计本身更糟糕, some_object是一个线程的仿函数,而atomic是一个关闭进程的标志)

1 个答案:

答案 0 :(得分:5)

你的班级:

class worker {
    std::atomic_bool done;
};

不可复制或可移动,因为std::atomic显式delete是其复制构造函数(隐式delete是其移动构造函数)。如果你想允许它被移动或复制,你必须自己写,例如:

worker(worker&& rhs)
: done(rhs.done.load())
{ }