首页 文章

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

提问于
浏览
1

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

我想破坏用于异步作业的资源 .

  • boost :: asio :: io_service

  • boost :: asio :: io_service :: work

  • boost :: asio :: steady_timer

  • boost :: thread

我通过共享指针管理单例对象,代码为AsyncTraceProcessor . 如您所知,当use count为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

1 回答

  • 1

    C与Java或C#不同 - 基本上是任何垃圾收集语言运行时 . 它具有确定性的破坏 . 物体的寿命非常有形和可靠 .

    async_service.~io_service();
    

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

    结果是,当生命周期结束时,语言仍然会调用析构函数 .

    这不是你想要的 .

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

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

    类的成员对象具有自动存储持续时间,并且在离开析构函数体时将被破坏 . 它们将按照声明它们的相反顺序被破坏 .

    样本

    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
    };
    

相关问题