技术开发 频道

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

  二. 为什么多线程会产生资源争夺?

  进程、线程是WinCE内核最基本的服务,也是内核最主要的组成部分。这两方面的知识是一个WinCE嵌入式软件开发人员必须掌握的基础知识,只有掌握了这些知识,才能够充分利用WinCE系统内核提供的服务。

  (1)什么是多线程?

  在谈到多线程资源安全性的时候,我们首先必须了解什么是线程。WinCE是一个抢占式多任务操作系统,抢占多任务又称为调度。多线程是这样一种机制,它是指允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。每一个线程都有五种状态,分别为运行、挂起、睡眠、阻塞、终止。多线程是多任务的特殊形式,多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。

  除了一些在运行中必不可少的资源(比如寄存器和栈等)外,线程本身并不占有系统的资源。但是线程却可以和同属于一个进程的另一个线程共享进程所拥有的全部资源。同进程一样,一个线程可以创建或者撤销另一个线程,同一个进程内的线程也可以并发执行。从并发性的角度来看,不仅可以在不同的进程之间并发执行,在同一个进程中的多个线程之间也是可以并发执行的。因此,这种方式可以使WinCE系统具有更好的并发执行能力,可以更为有效的利用系统资源,同时在一定程度上也极大的提高了系统的运行效率。

  (2)多线程资源争夺起源于同步与竞争

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

  因此,从上可知在线程之间要相互通信、相互协调才能完成任务。例如,当有多个线程共同访问同一个资源时,就必须保证第一个线程在正读取这个资源数据的时候,其它线程不能够修改它,这就需要线程之间相互通信。再有当一个线程要准备执行下一个任务之前,它必须等待另一个线程终止才能运行,这也需要彼此相互通信。一般在用户态模式下的同步方法有:互锁函数Interlocked(属原子访问),临界区Critical Section(保证临界区内的资源不被其它线程访问)。在内核模式下的同步方法有:事件对象Event(线程睡眠,而内核执行等待),互斥对象Mutex(类似于临界区,但相对较慢),信标对象Semaphore(用于限制资源访问数量),消息队列MsgQueue(利用很小的内存传递消息)等。

0
相关文章