我在无限循环的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);
}