如何在 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
,心想事成,心想事成。
我想要一个 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
,心想事成,心想事成。