在Windows Embedded CE下进行Native C++开发,一次错误使用多线程的经验教训

简介:

教训

圣诞前都忙于提交版本,编码量大增,平均2,300行,有时候上千行。没有做设计就直接编码,由于都是做一些设备相关的开发,output就是设备的表现,没办法进行单元测试。在做的过程中发现了一个设备挂死的问题,后来查出原因,是我误用线程导致的,面壁思过,blog下来,以此为鉴。

 

有问题的设计

设计很简单,4个类,一个抽象类,两个具体设备类和一个工厂类。

Client通过工厂类生成具体设备类的指针,保存到抽象类声明的指针中。通过多态来调用各个具体的设备类的方法。

由于两个设备类都需要用到定时任务,因此,我在抽象类里面生成了一个工作线程,定期调用子类(具体设备类)的多态方法执行任务。我在抽象类的构造函数里面生成线程,在释构函数里面发信号退出线程。问题就在释构的地方,由于抽象类的释构比具体设备类的释构要晚,在子类(具体设备类)已经调用完释构函数(我在子类的释构函数里面删除了对具体设备操作的指针),但是工作线程还没有停止下来,可能还在调用子类的多态方法在执行任务,程序就可能挂死了。

 

解决方法

建立两个protected的方法,一个用来启动工作线程,一个用来停止工作线程,子类在删除外部设备指针之前先停止工作线程,一切运行正常。

composition over inheritance

其实更好的方法是把线程处理和这个类结构解耦,不通过继承的方式来使用多线程处理,而是把线程处理类变成一个子类的一个成员,由子类来控制什么时候使用多线程。

继续面壁思过。




    本文转自Jake Lin博客园博客,原文链接:http://www.cnblogs.com/procoder/archive/2009/12/15/Windows-Mobile-MultiThreading.html,如需转载请自行联系原作者


相关文章
|
27天前
|
存储 前端开发 Java
【C++ 多线程 】C++并发编程:精细控制数据打印顺序的策略
【C++ 多线程 】C++并发编程:精细控制数据打印顺序的策略
43 1
|
10天前
|
人工智能 机器人 C++
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
|
24天前
|
数据可视化 关系型数据库 编译器
【C/C++ 单线程性能分析工具 Gprof】 GNU的C/C++ 性能分析工具 Gprof 使用全面指南
【C/C++ 单线程性能分析工具 Gprof】 GNU的C/C++ 性能分析工具 Gprof 使用全面指南
99 2
|
28天前
|
存储 前端开发 算法
C++线程 并发编程:std::thread、std::sync与std::packaged_task深度解析(一)
C++线程 并发编程:std::thread、std::sync与std::packaged_task深度解析
42 0
|
8天前
|
调度 Windows
|
22天前
|
存储 算法 Java
【C/C++ 线程池设计思路】 深入探索线程池设计:任务历史记录的高效管理策略
【C/C++ 线程池设计思路】 深入探索线程池设计:任务历史记录的高效管理策略
68 0
|
24天前
|
消息中间件 Linux 调度
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
63 0
|
28天前
|
存储 并行计算 Java
C++线程 并发编程:std::thread、std::sync与std::packaged_task深度解析(二)
C++线程 并发编程:std::thread、std::sync与std::packaged_task深度解析
62 0
|
22天前
|
Linux API C++
【C++ 线程包裹类设计】跨平台C++线程包装类:属性设置与平台差异的全面探讨
【C++ 线程包裹类设计】跨平台C++线程包装类:属性设置与平台差异的全面探讨
50 2
|
24天前
|
算法 安全 Unix
【C++ 20 信号量 】C++ 线程同步新特性 C++ 20 std::counting_semaphore 信号量的用法 控制对共享资源的并发访问
【C++ 20 信号量 】C++ 线程同步新特性 C++ 20 std::counting_semaphore 信号量的用法 控制对共享资源的并发访问
27 0

热门文章

最新文章