Windows同步对象小结
另外,在这里,我们把这四种同步对象,统统称为“锁”,以便于接下来的讨论。
第一、保护与同步。
基于这一性质,我们可以看出:Critical Section对象其本质更多的强调的是保护,而Event对象、Mutex对象与Semaphore对象更多的强调的是同步。不过,这样的区别,只是概念上的区别,其本身不会对程序本身产生影响。
第二、锁的等待超时
Section对象时,由于在等待进入关键代码段时无法设置等待超时,很容易造成死锁。
第三、线程锁与进程锁
Section对象并不意味着线程不会陷入核心态执行。当一个线程试图进入另一个线程拥有的关键代码段时,该线程就会进入等待状态。这意味着:该线程必须从用户态转为核心态。(为了提高这一方面的性能,Microsoft将循环锁的概念纳入到了Critical Section对象中,该线程可以有选择地不进入核心态等待.具体请参阅MSDN)
第四、锁的递归特质
第五、读写锁
对以上总结如图:
Futher Read:
----------------------------------------------------------------------------------------------------------------
同步对象
Windows共设置了4种主要的同步对象,分别是临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)和事件(Event)。MFC封装了它们,分别是类CCriticalSection、CMutex、CSemaphore和CEvent,它们都以CSyncObject为基类。
1、临界区
(1)创建:CCriticalSection myCriticalSection;
(2)对临界区加锁:myCriticalSection.Lock();
(3)解锁:myCriticalSection.UnLock();
2、互斥对象
它不仅可以在同一进程的线程之间实现资源的安全共享,而且可以在不用进程的线程之间实现资源的安全共享。
(1)创建:CMutex myMutex;
(2)创建一个CSingleLock对象:CSingleLock singleLock(&myMutex);
(3)得到Mutex对象:singleLock.Lock();
(4)如果其他线程已经拥有了该Mutex对象,那么系统会把该线程挂起来。
(5)释放:singleLock.UnLock();
3、信号量对象
允许多个线程同时访问一个受保护的资源。
(1)创建:CSemaphore myCSemaphore;
CSemaphore=new CSemaphore(5,5);
其中第一个参数为计数器的初始值,第二个参数为计数器的最大值。
(2)使用:CSingleLock singleLock(&myCSemaphore);
(3)减少CSemaphore对象的计数值:singleLock.Lock();
(4)释放CSemaphore对象:singleLock.UnLock();
4、事件对象(Event)
Event对象由CEvent类创建。一个Event对象可以有两种状态:有信号状态和无信号状态。线程通过检测Event对象的状态进行相应的处理。
(1)创建:CEvent StartThread;
(2)创建完之后,Event对象自动处于无信号状态,要给Event对象发送信号:StartThread.SetEvent();
(3)线程通过以下函数来检测事件的信号:
::waitForSingleObject(StartThread.m_hObject,INFINITE);
此函数的两个参数分别是要检测的Event对象的句柄(在该Event对象的m_hObject成员变量中)和等待该信号准备花的时间,INFINITE表示无时间限制即无限期的等待。