Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何构造C++中的对象,该对象执行异步后台任务 我希望在C++中有一个对象,它在后台执行异步任务,但是仍然可以使用代码来释放它,而不需要破坏它。_C++_Multithreading_C++11_Asynchronous_Destructor - Fatal编程技术网

如何构造C++中的对象,该对象执行异步后台任务 我希望在C++中有一个对象,它在后台执行异步任务,但是仍然可以使用代码来释放它,而不需要破坏它。

如何构造C++中的对象,该对象执行异步后台任务 我希望在C++中有一个对象,它在后台执行异步任务,但是仍然可以使用代码来释放它,而不需要破坏它。,c++,multithreading,c++11,asynchronous,destructor,C++,Multithreading,C++11,Asynchronous,Destructor,假设我有一个这样的物体: class MyObj { std::thread* asyncTask; bool result; public: MyObj() { asyncTask = new std::thread([this](){ result = doSomething(); }); }; bool isResult() { return result; }; } 由于销毁时线程仍然可以连

假设我有一个这样的物体:

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

由于销毁时线程仍然可以连接/运行,您如何确保对象仍然可以被释放而不终止进程?我曾考虑过使用线程运行计数器延迟析构函数,但这似乎不是正确的解决方案。部分复杂性在于线程通常需要访问类的元素,因此它也不能分离任何元素。

一般来说,唯一的方法是创建一个新进程来处理任务,该任务代价高昂,需要大量编组和繁忙工作,或者让线程协作

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

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

C++编译器基本上假设线程可以执行单线程操作,除非您执行显式同步操作。这允许进行某些重要的优化。成本是C++线程的状态在任何点都不需要任何意义;因此,在没有合作的情况下,从外部杀死或暂停它是不安全的


简言之,在编写doSomething时要考虑到合作和中止。

这似乎与以下方面更相关:当线程句柄在线程之前被销毁时,您可以终止线程、终止整个进程、等待线程完成或从线程分离。所有这些选项都不好。如果线程需要访问创建类的元素,那么你真的别无选择,只能延迟销毁外部类,直到线程完成。谢谢,我希望会有更优雅的东西,但我想这必须要做。