2017-04-17 30 views
0

我想在C++中有一个在后台执行异步任务的对象,但仍然可以通过代码使用它来请求释放,而不会破坏事情。如何在C++中构造一个执行异步后台任务的对象

比方说,我有一个对象是这样的:

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

,你会如何去确保该对象可仍然没有终止该进程(由于线程仍然可以释放可连接/在破坏的同时运行)?我想过一些涉及用线程运行计数器来延迟析构函数的方法,但这似乎并不是正确的解决方案。部分复杂性是线程需要正常访问类的元素,所以它不能分离。

+0

这似乎与以下情况更相关:https://cs.stackexchange.com/ – Jonas

+0

当线程句柄在线程之前被破坏时,您可以终止线程,杀死整个进程,等待线程完成或分离线程。所有这些选项都很糟糕。 – nwp

+0

如果线程需要访问创建类的元素,那么你实在别无选择,只能延迟破坏外部类直到线程结束。 – lcs

回答

1

要做到这一点的唯一方法是创建一个新的进程来处理任务(昂贵的,大量的编组和繁忙工作),或让线程进行合作。

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

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

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

总之,写下你的doSomething与合作和放弃在脑海中。

+0

谢谢,我希望能有更优雅的东西,但我想这将不得不做。 –