gpt4 book ai didi

C++ Boost::asio::io_service 如何在程序完成时安全销毁 io_service 资源

转载 作者:行者123 更新时间:2023-11-30 05:12:27 28 4
gpt4 key购买 nike

我为异步 io_service 工作运行 aync 作业线程。

我想销毁用于异步作业的资源。

  • boost::asio::io_service
  • boost::asio::io_service::work
  • boost::asio::steady_timer
  • boost::线程

我通过共享指针管理单例对象,在代码 AsyncTraceProcessor 下方。如您所知,当使用计数为 0 时,shared_ptr 会自动调用析构函数。那时我想以安全的方式销毁所有资源。

我在下面写了代码,但是 JVM 上有 SIGSEGV 错误。 (本程序为java原生库程序)

我该如何解决?在我看来,已经排队但尚未执行的工作会引发此错误。在这种情况下,如何安全处理剩余工程?

AsyncTraceProcessor::~AsyncTraceProcessor() {
cout << "AsyncTraceProcessor Desructor In, " << instance.use_count() << endl;
_once_flag;
cout <<"++++++++++flag reset success" << endl;
traceMap.clear();
cout <<"++++++++++traceMap reset success" << endl;
timer.cancel();
cout <<"++++++++++timer reset success" << endl;
async_work.~work();
cout <<"++++++++++work reset success" << endl;
async_service.~io_service();
cout <<"++++++++++io_service reset success" << endl;
async_thread.~thread();
cout <<"++++++++++thread reset success" << endl;
instance.reset();
cout <<"++++++++++instance reset success" << endl;
cout << "AsyncTraceProcessor Desructor Out " << endl;
}

错误日志

AsyncTraceProcessor Desructor In, 0
Isn't Null
++++++++++flag reset success
++++++++++traceMap reset success
++++++++++timer reset success
++++++++++work reset success
A fatal error has been detected by the Java Runtime Environment:
++++++++++io_service reset success
++++++++++thread reset success
SIGSEGV
++++++++++instance reset success
AsyncTraceProcessor Desructor Out

最佳答案

C++ 不同于 Java 或 C# - 基本上是任何垃圾收集语言运行时。它具有确定性破坏。对象的生命周期是非常有形和可靠的。

async_service.~io_service();

这是显式调用析构函数而不删除对象,或者在自动存储变量的生命周期结束之前。

结果是当生命周期结束时,该语言仍将调用析构函数。

这不是你想要的。

如果您需要清除工作,请将其设置为 unique_ptr<io_service::work>这样你就可以work_p.reset()相反(它确实调用了它的析构函数一次)。

之后,只需等待线程完成io_service::run() ,意味着你应该 thread::join()他们在线程对象被破坏之前。

Member objects of classes have automatic storage duration and will be destructed when leaving the destructor body. They will be destructed in the reverse order in which they are declared.

示例

struct MyDemo {
boost::asio::io_service _ios;
std::unique_ptr<boost::asio::io_service::work> _work_p { new boost::asio::io_service::work(_ios) };

std::thread _thread { [&ios] { ios.run(); } };

~MyDemo() {
_work_p.reset();
if (_thread.joinable())
_thread.join();
} // members are destructed by the language
};

关于C++ Boost::asio::io_service 如何在程序完成时安全销毁 io_service 资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44517825/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com