我为异步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 回答
C与Java或C#不同 - 基本上是任何垃圾收集语言运行时 . 它具有确定性的破坏 . 物体的寿命非常有形和可靠 .
这是显式调用析构函数而不删除对象,或者在自动存储变量的生命周期结束之前 .
结果是,当生命周期结束时,语言仍然会调用析构函数 .
这不是你想要的 .
如果您需要清除工作,请将其设为
unique_ptr<io_service::work>
,这样您就可以work_p.reset()
(它会调用它的析构函数,一次) .之后,只需等待线程完成
io_service::run()
,这意味着在线程对象被破坏之前你应该thread::join()
.样本