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

标签 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&)'

海湾合作委员会 4.9

正如我所见,atomic 无法复制,只能移动。 上面的代码需要为 some_object 类复制 ctor。 如何解决这个问题?

(可能是设计本身比较糟糕, 这里,some_object 是线程的仿函数,atomic 是关闭进程的标志)

最佳答案

你的类(class):

class worker {
    std::atomic_bool done;
};

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

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

关于c++ - std::generate_n 算法需要复制 ctor。如何在下面的代码中避免这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32869601/

相关文章:

C++11 gcc 4.9.2 算法 partition_copy() 导致 SIGABRT,与 back_inserter 一起工作

c++ - 绘制二维矩阵的行和列

C++:如果 std::atomic_flag 是唯一的无锁原子类型,如何在 C++ 中实现无锁数据结构?

c++ - 在 C++ 中使用原子 TestAndSet 混合无锁和全锁线程同步

c++ - 在 Eigen 库 vector 上使用 std::upper_bound 时出错

c++ - 是否有类似 std::remove() 的东西不保留 vector 保留元素的顺序?

c++ - 如何将 C++ COM 连接到 WCF 服务

c++ - 使用 Boost.Log 的 channel 层次结构进行严重性和接收器过滤

c++ - MXE Qt5 应用程序在 Docker 容器中构建失败

c++ - 多核CPU上32bit读的原子性