如何在 C++ 中构建执行异步后台任务的对象

How to structure an object in C++ that does asynchronous background tasks

我想要一个 C++ 对象,它在后台执行异步任务,但仍然可以通过使用它的代码请求释放而不会破坏任何东西。

假设我有这样一个对象:

class MyObj {
  std::thread* asyncTask;
  bool result;
  public:
    MyObj() {
      asyncTask = new std::thread([this](){
        result = doSomething();
      });
    };
    bool isResult() {
      return result;
    };
}

您将如何确保对象仍然可以在不终止进程的情况下被释放(由于销毁时线程仍然 joinable/running)?我考虑过一些涉及使用线程 运行 计数器延迟析构函数的事情,但这似乎不是正确的解决方案。部分复杂性在于线程需要正常访问 class 的元素,因此它不能直接分离任何一个。

通常唯一的方法是创建一个新进程来处理任务(昂贵,大量编组和繁忙工作),或者让线程协作。

一个合作的线程定期检查它是否应该中止。当它检测到它应该中止时,它就会这样做。它必须这样做即使它阻塞了某些资源

对于简单的任务,这很简单。对于一般任务,几乎是不可能的。

C++ 编译器基本上假定线程将成为单线程,除非您明确地同步操作。这允许某些重要的优化。代价是 C++ 线程的状态在任何时候都不需要任何意义;所以杀死它或从外部暂停它是不安全的(没有合作)。

总之,写下你的doSomething,心想事成,心想事成。