欢迎来到天天文库
浏览记录
ID:9497321
大小:58.00 KB
页数:7页
时间:2018-05-01
《windows ce 进程、线程和内存管理(二)》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、WindowsCE进程、线程和内存管理(二) 二、同步 在多数情况下,线程之间难免要相互通信、相互协调才能完成任务。比如,当有多个线程共同访问同一个资源时,就必须保证一个线程正读取这个资源数据的时候,其它线程不能够修改它。这就需要线程之间相互通信,了解对方的行为。再有当一个线程要准备执行下一个任务之前,它必须等待另一个线程终止才能运行,这也需要彼此相互通信。实际开发过程中,线程间需要同步的情况非常多。FC也对临界区函数进行了封装。临界区相关函数:void InitializeCriticalSection(LPCRITICAL_SEC
2、TION);void EnterCriticalSection(LPCRITICAL_SECTION);void LeaveCriticalSection(LPCRITICAL_SECTION);void DeleteCriticalSection(LPCRITICAL_SECTION); 举例如下:voidCriticalSectionExample(void){ CRITICAL_SECTION csMyCriticalSection; InitializeCriticalSection(csMyCriticalSection
3、); ///初始化临界区变量 __try { EnterCriticalSection(csMyCriticalSection); ///开始保护机制 ///此处编写代码 } __finally ///异常处理,无论是否异常都执行此段代码 { LeaveCriticalSection(csMyCriticalSection); ///撤销保护机制 }}MFC类使用更简单:CCriticalSection cs;cs.Lock();///编写代码cs.Unlock(); 使用临界区要注意的是避免死锁。当有两个
4、线程,每个线程都有临界区,而且临界区保护的资源有相同的时候,这时就要在编写代码时多加考虑。 3、事件对象 事件对象运行在内核模式。与用户模式不同,内核模式下线程利用等待函数来等待所需要的事件、信号,这个等待过程由操作系统内核来完成,而线程处于睡眠状态,当接收到信号后,内核恢复线程的运行。内核模式的优点是线程在等待过程中并不浪费CPU时间,缺点是从用户模式切换到内核模式需要一定的时间,而且还要切换回来。在讲解事件对象前应该先谈谈等待函数。等待函数有四个。具体参数和功能见下表: 函数参数和功能ultipleObjects参数1为Dsgu
5、ltipleObjects参数1为DultipleObjects函数相似,只是多了一个唤醒掩码。唤醒掩码都是和消息有关的。此函数不但能够为事件等待,还能为特定的消息等待。其实这个函数就是专为等待消息而定义的。MsgultipleObjectsEx参数1为DsgultipleObjects函数的扩展。将原来函数的参数3除掉,添加参数5为标志。标志有两个值:0或MO_INPUTAVAILABLE。 如果一个线程既要执行大量任务同时又要响应用户的按键消息,这两个专用于等待消息的函数将非常有用。 和事件有关的函数有:HANDLE Create
6、Event(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOLbManualReset, BOOL bInitialState, LPTSTR lpName);BOOL SetEvent(HANDLE hEvent);BOOL PulseEvent(HANDLE hEvent);BOOL ResetEvent(HANDLE hEvent);HANDLE OpenEvent(Dutex(LPSECURITY_ATTRIBUTES lpMutexAt
7、tributes, BOOL bInitialOe);BOOL ReleaseMutex(HANDLE hMutex); 互斥对象包含一个引用计数,一个线程ID和一个递归计数。引用计数是所有内核对象都含有的。线程ID表示哪个线程正在使用互斥资源,当ID为0时,互斥对象发出信号。递归计数用于一个线程多次等待同一个互斥对象。函数CreateMutex创建一个互斥对象,参数1必须设置为NULL,参数2如果设置为FALSE,表示当前线程并不占有互斥资源,互斥对象的线程ID和递归计数都被设置为0,互斥对象处于有信号状态。如果
8、设置为TRUE,表示当前线程将占有互斥资源,互斥对象的线程ID被设置为当前线程ID,递归计数被设置为1,互斥对象处于无信号状态。当调用等待函数时,等待函数检验互斥对象的线程ID是否为0,如果为
此文档下载收益归作者所有