在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,如需转载请自行联系原作者


相关文章
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
174 1
C++ 多线程之初识多线程
|
消息中间件 存储 安全
|
存储 并行计算 安全
C++多线程应用
【10月更文挑战第29天】C++ 中的多线程应用广泛,常见场景包括并行计算、网络编程中的并发服务器和图形用户界面(GUI)应用。通过多线程可以显著提升计算速度和响应能力。示例代码展示了如何使用 `pthread` 库创建和管理线程。注意事项包括数据同步与互斥、线程间通信和线程安全的类设计,以确保程序的正确性和稳定性。
267 5
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
495 6
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
292 0
C++ 多线程之线程管理函数
|
Ubuntu Linux Python
如何利用wsl-Ubuntu里conda用来给Windows的PyCharm开发
如何在WSL(Windows Subsystem for Linux)的Ubuntu环境中使用conda虚拟环境来为Windows上的PyCharm开发设置Python解释器。
1603 1
|
监控 关系型数据库 MySQL
PowerShell 脚本编写 :自动化Windows 开发工作流程
PowerShell 脚本编写 :自动化Windows 开发工作流程
510 0
|
存储 安全 程序员
Windows任务管理器开发原理与实现
Windows任务管理器开发原理与实现
|
开发者 C# Windows
WPF与游戏开发:当桌面应用遇见游戏梦想——利用Windows Presentation Foundation打造属于你的2D游戏世界,从环境搭建到代码实践全面解析新兴开发路径
【8月更文挑战第31天】随着游戏开发技术的进步,WPF作为.NET Framework的一部分,凭借其图形渲染能力和灵活的UI设计,成为桌面游戏开发的新选择。本文通过技术综述和示例代码,介绍如何利用WPF进行游戏开发。首先确保安装最新版Visual Studio并创建WPF项目。接着,通过XAML设计游戏界面,并在C#中实现游戏逻辑,如玩家控制和障碍物碰撞检测。示例展示了创建基本2D游戏的过程,包括角色移动和碰撞处理。通过本文,WPF开发者可更好地理解并应用游戏开发技术,创造吸引人的桌面游戏。
826 0
|
开发者 iOS开发 C#
Uno Platform 入门超详细指南:从零开始教你打造兼容 Web、Windows、iOS 和 Android 的跨平台应用,轻松掌握 XAML 与 C# 开发技巧,快速上手示例代码助你迈出第一步
【8月更文挑战第31天】Uno Platform 是一个基于 Microsoft .NET 的开源框架,支持使用 C# 和 XAML 构建跨平台应用,适用于 Web(WebAssembly)、Windows、Linux、macOS、iOS 和 Android。它允许开发者共享几乎全部的业务逻辑和 UI 代码,同时保持原生性能。选择 Uno Platform 可以统一开发体验,减少代码重复,降低开发成本。安装时需先配置好 Visual Studio 或 Visual Studio for Mac,并通过 NuGet 或官网下载工具包。
1572 0