技术开发 频道

WinCE陷进程死锁 马儿光吃草不快跑

  二. Windows CE.NET的线程死锁机制

  (1)资源同步与竞争

  在多数情况下,线程之间要相互通信、相互协调才能完成任务。比如,当有多个线程共同访问同一个资源时,就必须保证一个线程正读取这个资源数据的时候,其它线程不能够修改它,这就需要线程之间相互通信,了解对方的行为。因此, Windows CE.NET线程之间的通信需要同步。一般在用户模式下的同步有,如:互锁函数Interlocked(属原子访问),临界区Critical Section(保证临界区内的资源不被其它线程访问),还有其它几种内核模式下的同步:事件对象Event(线程睡眠,而内核执行等待),互斥对象Mutex(类似于临界区,但相对较慢),信标对象Semaphore(用于限制资源访问数量),消息队列MsgQueue(利用很小的内存传递消息)等。

  在Windows CE.NET多任务实时系统中,当两个或更多独立线程同时访问同一资源时,就出现了资源竞争。资源竞争的影响因素是多种多样的,取决于具体的情况。资源竞争使到多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放,而由于线程被无限期地阻塞,因此程序就不能正常运行。一个通俗的例子:如在人行道上两个人迎面相遇,为了给对方让道,两人同时向一侧迈出一步,双方无法通过,又同时向另一侧迈出一步,这样还是无法通过。假设这种情况一直持续下去,这样就会发生“资源同步与竞争”的死锁现象。

(2)Windows CE的线程死锁原理

  在Windows CE.NET共享资源的系统中,防止访问冲突极为重要。一般来说,我们可以通过锁定一个资源来防止任何其它线程访问这个资源,以避免资源竞争,但这有可能导致另一个问题:死锁。所以,导致死锁的根源在于不适当的对特定对象访问的线程管理。

  正常来说,被允许执行的线程首先必须拥有对变量或对象的排他性的访问权。当线程访问对象时,线程会给访问对象加锁,而这个锁会导致其它也想访问同一对象的线程被阻塞,直至第一个线程释放它加在对象上的锁。在Windows CE.NET系统中,如果一个线程不能得到需要的某个资源,它将挂起执行(阻塞),直到该资源有效为止。因此,在Windows CE系统运行过程中,各线程都将会对资源进行锁定或解锁。

  但由于各线程运行和指向其资源的相对时序各不相同,有可能出现由于各个线程正在等待被其它线程保持的资源,从而导致所有线程都无法运行的情况。例如,有1台打印机和1个输入逻辑接口,有2个进程p1和p2,它们分别占用打印机和逻辑接口。当p1申请已被p2占用的逻辑接口,而p2申请已被p1占用的打印机这种情况出现时,p1和p2僵持不下,称为死锁进程。此时操作系统中虽然有死锁进程出现,但系统中其他进程仍然正常运行。如果系统中所有进程都进入死锁,即没有一个进程能前进的话,称为系统死锁,这种情况是很少见的。我们平常说的“死锁”一般指进程死锁。

  线程死锁是多线程环境中一个锁定资源的问题,只有当以下四个条件同时具备时,才会发生死锁。①相互排除---每次只有一个线程可以使用某个锁定的资源;②非先占---其它线程不能强迫另一个线程释放资源;③保持并等待---线程在等待需要的其它任何资源时,保持它们已经锁定的资源;④循环等待---存在一个线程循环链,其中每个线程保持链中下一个线程所需要的资源。这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。
 

0
相关文章