c++ - 在 `std::future` 中运行循环直到破坏 - 惯用方式?

标签 c++ multithreading c++14 future

我要成员(member)std::future<void>在循环中不断调用一个函数,直到父对象被销毁。

我目前的解决方案涉及将 future 包装在一个带有 bool 标志的类中,并在销毁时将标志设置为 false。

class Wrapper
{
    std::future<void> fut;
    bool wrapperAlive{true};

public:
    Wrapper() : fut{std::async(std::launch::async, [this]
    { 
        while(wrapperAlive) doSomething();
    })} { }

    ~Wrapper()
    {
        wrapperAlive = false;
    }
};

有没有更惯用的方法来做到这一点?

最佳答案

这是您的代码的无数据争用版本:

class Wrapper {
  std::atomic<bool> wrapperAlive{true}; // construct flag first!
  std::future<void> fut;
public:
  Wrapper() :
    fut{std::async(std::launch::async, [this]
      { 
        while(wrapperAlive)
          doSomething();
      }
    )}
  {}

  ~Wrapper() {
    wrapperAlive = false;
    fut.get(); // block, so it sees wrapperAlive before it is destroyed.
  }
};

接下来我要做的是写:

template<class F>
struct repeat_async_t {
  F f;
  // ...
};
using repeat_async = repeat_async_t<std::function<void()>>;
template<class F>
repeat_async_t<std::decay_t<F>> make_repeat_async(F&&f){
  return {std::forward<F>(f)};
}

它需要一个永远重复的任务,并将其捆绑在那里,而不是将流逻辑与执行的逻辑混合。

此时,我们可能想要添加一个中止方法。

最后,忙循环线程很少是个好主意。因此,我们会添加某种等待更多数据使用的系统。

它最终看起来与您的代码有很大不同。

关于c++ - 在 `std::future` 中运行循环直到破坏 - 惯用方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32525615/

相关文章:

c# - 如何在 C# 中正确实现可取消、长时间运行的线程?

java - "A synchronized block in Java is synchronized on some object"是什么意思..?

c++ - 将元素添加到 STL 容器的背面

c++ - 在 C++14 类的私有(private)部分中声明时,默认参数和成员初始化之间哪一个最好?

c++ - 在 C++ 中的每个案例步骤自动中断的 Switch 语句

c++ - 为什么需要 const [C++]?

c++ - CMake 错误 : mismatch for the compiler version between your conan profile

c++ - 在 C++ 的类构造函数中列出初始化

ios - 后台保存带来的小核心数据性能提升

c++ - 按共享指针 vector 中的值删除