C++中的异步销毁和RAII
Asynchronous Destruction and RAII in C++
根据RAII,当我销毁对象时,它的资源将被释放。但是,如果对象的销毁需要异步操作,该怎么办?在不使用RAII的情况下,我可以调用类的close
方法,该方法将调用必要的异步操作,并将shared_ptr
保留到我的对象(使用shared_from_this
(,以便优雅地处理来自异步操作的回调。在调用close
之后,我可以删除指向该对象的指针,因为我不再需要它了——但我知道,在执行异步操作之前,该对象不会被删除。
但是如何使用RAII实现这一点呢?一种可能的解决方案是使用一个包装器,该包装器在被销毁时将调用by对象的close
方法。但是这是否意味着我的课程是RAII课程?
class Resource: public std::enable_shared_from_this<Resource> {
int id;
public:
close() {
some_async_functin([t = shared_from_this()] {
std::cout << "Now I am closed " << t->id << std::endl;
}
}
}
我的解决方案:
class ResourceWrapper {
std::shared_ptr<Resource> res;
~ResourceWrapper() {
res.close();
}
}
要相对于线程异步销毁的对象o(创建该对象的线程T(本身不能通过RAII进行管理,因为堆栈分配对象的销毁本质上是同步的。如果o是通过RAII模型管理的,那么当包含其声明的最内部块终止时,线程T将执行其析构函数,直到析构函数终止。
如果您不想占用T来释放o的资源(但要确保它们确实已释放(,则必须将资源释放委托给另一个线程。你可以通过
通过使用new
动态创建o并异步调度相应的free
(例如通过std::async
(或
通过让o的析构函数调度资源清理以进行单独的异步发布(同样,通过std::async
或类似方式(,间接地使用RAII。
后者是间接的,因为它需要一个或多个单独的对象来表示正在清理的资源,直到清理完成——尤其是在涉及回调或类似的情况下。这些对象与o本身所面临的问题相同。顺便说一句,这种间接性本身并没有什么错。RAII仍然提供它通常提供的好处。
您需要两个类:AcquirableResource
和AcquiredResource
。您首先创建AcquirableResource
实例,该实例在关闭后仍然有效(甚至可能用于重新打开(;那么AcquirableResource
中的AcquiredResource
就是打开的资源。这完全是RAII。
// define the AcquirableResource and AcquiredResource
int main() {
AcquirableResource ares("filename.txt");
// ... your code here ...
{
auto res(ares); // open
if (!res) { /* error handler */ }
// ... your code here ...
// res goes out of scope, signals ares
// ares closes file (can be async)
}
// ares is still valid here
// ... your code here ...
// ares goes out of scope, dtor close in sync
}
- 具有瞬态资源的RAII类
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 使用RAII在给定次数的迭代后重新分配资源
- 如何在C++中实现带有packaged_task的异步等待循环?
- 创建 Spdlog 异步文件记录器时遇到困难
- 在文件夹迭代上实现 RAII
- C ++异步键盘输入(标准方式)
- 在 RAII 构造中修改 RVO 值是否安全?
- 在 gtkmm 中异步加载图像
- 带有 Boost.Beast 的异步读取标头
- 如何在 c++ 中异步调用静态方法?
- libcurl :C++处理多个异步请求
- 如何在C++上启动异步线程
- RAII 等效于 FIFO 发布订单
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- 增强 ASIO 和串行端口异步读取
- 使用 Qt5 SQL 进行异步数据库访问的策略
- 如何使用从处理程序调度的最终回调将响应异步返回给调用方on_read?
- C++中真正的异步文件 IO
- 提升::Asio 异步聊天客户端停止与服务器通信