惯用的移动std :: atomic_flag的方式(或:如何移动promises)

时间:2018-07-31 14:36:53

标签: c++ multithreading concurrency atomic

我在无限循环的std :: thread周围有一个RAII包装器类。包装器包含一个std::atomic_flag / std::atomic<bool>,该共享器与线程共享以最终将其关闭(包装器写入;线程读取)。一切都很好,直到我需要移动Wrapper类,因为原子没有移动构造函数。

如何以线程安全的方式移动控制标志和线程

我的想法是将atomic_flag包装在shared_ptr中,并给该线程一个副本。只要我不写shared_ptr(只写底层的atomic_flag),我就很有信心它将是线程安全的。

但是,这感觉不是很惯用的,我想有一种解决这个问题的惯用方式。在我看来,std::promise必须解决了类似的问题。我试图查看libc ++的src,但无法轻松识别代码。

该代码的示例实现与此类似(根据内森的输入进行更新

void run(std::atomic_bool *active) {
  while (active->load()) {
     // ...
  }
}

class RaiiThread {
public:
  RaiiThread() : t_(&run, active_.get()) {}
  RaiiThread(RaiiThread &&) = default;
  ~RaiiThread() {
    if (t_.joinable()) {
      active_->store(false);
      t_.join();
    }
  }

private:
  std::unique_ptr<std::atomic_bool> active_{
      std::make_unique<std::atomic_bool>(true)};
  std::thread t_;
};

int main() {
  RaiiThread t1;
  auto t2 = std::move(t1);
}

0 个答案:

没有答案