技术开发 频道

WinCE多线程事半功倍 但须避免资源争夺

  【IT168 专稿】WinCE系统是一个多任务的操作系统。一般来说,实现多任务的方法是采用多线程和多进程机制。因此掌握多进程和多线程的技巧和方法,对于编写复杂的WinCE嵌入式程序是必须的。因为多线程编程方法能有效地解决各种并行的复杂工作任务,使一些特别复杂的总体设计和解决方案变得更简洁和更清晰。

  近期,我在一个嵌入式开发项目中就体验到轻视多线程的惨痛教训。由于在开发过程中对多线程没有处理好,结果是经常会出现线程争夺资源,使系统变得缓慢或直接瘫痪,这些难以察觉的多线程处理错误使到项目组成员被迫花了许多额外的时间来处理。不但项目开发进度严重滞后,而且还影响到产品的上市时间。在WinCE编程中,其实多线程处理并不象表面看起来的那么简单。本文分享我在此项目得到的一些关于多线程的经验和教训。

  一. 多线程中最常见的两类资源争夺问题

  一个嵌入式系统开发一般来说有两种编程方式:一是内核态编程,另一种是用户态编程。当一个进程执行系统调用而陷入内核执行时,称为进程处于内核态,此时CPU处于特权级最高的内核执行过程。当进程在执行用户自己的代码时,则称为处于用户态,此时CPU在特权级最低的用户代码中运行。在内核态下的CPU可执行任何指令,在用户态下的CPU只能执行非特权指令,用户态的程序不能随意操作内核地址空间。所以,多线程资源冲突在内核编程中远比用户态程序的编程要常见。

  在这次嵌入式项目中,由于依仗WinCE内核是由我们项目组自已定制和剪裁的,许多项目成员为了让程序的执行效率更高、代码更短,不但经常把进程陷入到内核运行态中执行,而且还过份的强调利用多线程来提高执行效率。结果是不但没有提高程序执行效率,反而使到WinCE系统经常出现资源争夺情况。轻则运行缓慢,重则死锁和死机。我们总结这次开发失败的经验教训是:多线程编程能让开发事半功倍,但一定要注意多线程资源争夺的安全性。这是一个开发人员如何做到“鱼与熊掌”两者平衡兼得的考验问题。

  (1)多线程资源冲突问题

  WinCE系统支持多线程,这无疑是一件很好的事情。但这同时也带来了另一个比较棘手的设计问题,那就是如何让多线程的资源争夺是安全的,这是非常重要的。一般的说,多线程的资源安全性是指一个线程在被调用过程中,还未返回时又再次被其它线程调用的情况下执行结果的可靠性。如果结果是可靠的,则称这个多线程安全的;如果结果是不可靠的,则称这个多线程是不安全的,原因是发生了多线程资源冲突问题。因此,多线程资源安全性如果处理不当,轻则导致程序运行时出错,严重的话将导致系统崩溃。

  (2)多线程死锁问题

  从以上第一点我们可知,在WinCE多线程编程中防止线程资源冲突是极为重要的。因此,这个项目开发过程中我们大量通过锁定一个资源来防止任何其它线程访问这个资源,以避免资源竞争。但没有想到的是,这又导致了多线程资源争夺的另一个常见问题:死锁。结果在项目测试时,我们遇到的最常见的现象就是多线程因资源竞争不当而产生死锁的现象,后来需要逐一分析资源死锁的过程,这让我们开发组的各成员都备受折磨和感到痛苦不堪。

  所谓死锁(Dead Lock)是指在WinCE编程中两个或两个以上的并发进程在执行过程中,如果每个进程持有某种资源而又都在等待别的进程释放它们现在保持着的资源,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法进行下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

0
相关文章