boost 1.55库,使用thread,为何出现以下怪现象?请大牛来指点!!
#include <boost/thread.hpp>
#include <boost/bind.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/smart_ptr.hpp>
using namespace boost;
#include "EasyLog.h"
#include "Utils.h"
boost::thread g_thrd;
class MyClass : public enable_shared_from_this<MyClass>
{
public:
int ThreadProc()
{
log_debug("[%s] BEGIN ========\n", __FUNCTION__);
Utils::ThreadSleep(2000);
log_debug("[%s] END ======================\n", __FUNCTION__);
return 0;
}
MyClass()
{
log_debug("++++\t[%s]\n", __FUNCTION__);
}
~MyClass()
{
log_debug("----\t[%s]\n", __FUNCTION__);
}
void Start()
{
//g_thrd = // 奇怪的地方在这儿!!,如果不加注释,使用g_thrd进行赋值保存,就晕了。。。
boost::thread(boost::bind(&MyClass::ThreadProc, shared_from_this()));
}
};
void Test_Thread()
{
shared_ptr<MyClass> sp(new MyClass());
sp->Start();
}
void CodeWrapper()
{
Test_Thread();
}
===========================================================
上述代码在VC2008+Win7环境下,输出结果为:
23:29:22 ~173C DEBUG| ++++ [MyClass::MyClass]
23:29:22 ~1BAC DEBUG| [MyClass::ThreadProc] BEGIN ========
23:29:24 ~1BAC DEBUG| [MyClass::ThreadProc] END ======================
23:29:24 ~1BAC DEBUG| ---- [MyClass::~MyClass]
表示在子线程退出之后,MyClass正确的调用了析构函数。
==============================================================
问题在于:
1. 在MyClass::Start()中,如果使用g_thrd保存启动的子线程,子线程依然可以正确退出(在任务管理器中可以确认),但MyClass::~MyClass()就不会被调用了,也就是说,new出来的MyClass不会被析构。
即:
23:29:24 ~1BAC DEBUG| ---- [MyClass::~MyClass]
这一行,永远不会打印出来。。。。。。
请问高手,为什么我用一个全局的g_thrd去保存这个子线程的对象,子线程正确退出之后,~MyClass不会被执行呢?我在这个子线程里打印了shared<MyClass>的use_count(),值为2,表示shared_ptr对象的引用计数没有问题,那问题出在哪儿呢?
理解不了了,请高手指点!!!
相关推荐
论文复现基于欠谐振工作区间的全桥LLC变换器混合控制仿真建模与动态性能分析(Simulink仿真实现)
内容概要:本文系统解读了一套完整的多机器人路径规划(MAPF)MATLAB代码库,重点剖析了基于优先级规划与Petri网融合的多智能体无冲突路径生成框架。文章详细阐述了该框架的四层架构设计:几何层负责地图解析与栅格化处理,拓扑层构建四邻域图与Petri网模型,调度层实现基于优先级启发式的路径规划与冲突消解,呈现层完成动画与视频可视化输出。核心创新包括动态边权膨胀机制、节点预留历史查询、几何惩罚驱动的局部同步以及Petri网双阶段优化策略,显著提升了算法在大规模场景下的求解效率与鲁棒性。; 适合人群:具备一定编程基础和算法基础,从事机器人路径规划、智能交通、仓储物流调度等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:① 学习和复现基于优先级规划的多智能体无冲突路径生成方法;② 掌握动态边权膨胀、节点预留历史等关键技术以提升路径规划效率;③ 利用Petri网进行整数规划求解并实现双阶段优化;④ 构建可扩展的多机器人系统仿真平台并实现轨迹可视化。; 阅读建议:建议读者按照文中所述的数据流顺序逐步学习各模块设计,重点关注四层架构之间的接口关系与信息传递机制。在实践过程中应结合提供的完整代码与测试案例,调试并验证不同同步策略的效果差异,并尝试对框架进行功能扩展,如引入回溯机制以提高算法完备性。
基于容积卡尔曼滤波CKF的车辆状态估计Carsim和Matlab联合仿真(说明文档+仿真源文件+运行说明)
内容概要:本资源提供了基于容积卡尔曼滤波(CKF)的车辆状态估计算法在Carsim与Matlab/Simulink环境下的联合仿真解决方案,包含完整的说明文档、仿真源文件及运行指南。通过Carsim构建高精度车辆动力学模型,Simulink实现CKF算法设计与状态估计,有效融合两者优势,实现了对车辆关键状态参数(如质心侧偏角、横摆角速度、车速等)的高精度实时估计。该方法克服了传统传感器直接测量成本高、安装难的问题,提升了车辆动态性能分析与控制系统的智能化水平。; 适合人群:适用于从事车辆工程、智能驾驶、控制理论与应用等相关领域的科研人员、高校研究生及企业研发工程师,尤其适合具备一定Carsim和Matlab联合仿真基础的技术人员。; 使用场景及目标:①开展车辆状态估计算法的研究与验证,提升无人车、ADAS系统中的感知能力;②完成学术论文复现、毕业课题设计或工程项目开发中的核心算法模块搭建;③深入理解非线性滤波算法(如CKF)在实际车辆系统中的建模与应用流程。; 阅读建议:建议用户结合说明文档逐步运行仿真程序,重点关注Carsim与Simulink的接口设置、信号交互机制以及CKF算法模块的设计逻辑,同时可通过修改工况条件和噪声参数来测试算法鲁棒性,强化理论与实践的结合。
高校技术转移办公室在推动成果转化过程中面临哪些信息整合难题?.docx
高校技术转移办公室在推动成果转化过程中面临哪些信息整合难题?
回流焊温度曲线合格判据分析器
【适用方向】工程数据分析与报表 【工具用途】 「回流焊温度曲线合格判据分析器」用于半导体制造过程中的工程计算与分析, 帮助工艺、设备、质量与生产工程师快速完成日常数据处理工作。 【能解决什么】 · 免去手工Excel 反复整理与公式编写,直接导入数据即可出结果 · 计算过程透明,关键参数可按现场实际调整 · 输出图表与明细报表,便于直接用于汇报与存档 【包内内容】 · 工具源码(Python,可直接运行) · 使用说明(数据格式与操作步骤) · 依赖清单与示例数据 【适用人群】 半导体 FAB / 晶圆厂:工艺、设备、质量、IE、生产工程师; 以及 MES 与智能制造方向的技术人员。 【使用说明】 解压后按说明导入数据运行即可;工具在本地处理数据,不联网。
高校技术转移办公室人员如何高效开展科技成果评价与筛选工作?.docx
高校技术转移办公室人员如何高效开展科技成果评价与筛选工作?


