一直在使用MFC的线程同步类,但却没有深入研究过,正因为此几个月前写的一个较大的代码还发生了互锁,导致查了好半天。今天静下心来大致复习一遍。
MFC中有7种多线程类,分两类:同步对象(CSyncObject, CSemaphore, CMutex, CCriticalSection, CEvent);以及同步访问对象(CMultiLock and CSingleLock)
其中我最常用的是CCriticalSection,从本科毕设的MPEG4流数据链表缓存,到前几天写的USB摄像头回放并图像数据处理,对于其它同步类却不甚清楚
查相关资料简单总结如下:
同步对象:
CCriticalSection临界区是保证在某一个时间只有一个线程可以访问数据的方法;
CMutex互斥与CCriticalSection很相似,但是使用时相对复杂一些,它不仅可以在同一应用程序的线程间实现同步,还可以在不同的进程间实现同步(如dll);
Csemaphore信号量可以同一时刻允许多个线程访问同一个资源。
事件对象:
CEvent事件对象处于两种状态之一:有信号和无信号,线程可以监视处于有信号状态的事件,以便在适当的时候执行对事件的操作。使用SetEvent()来发出信号,使用WaitForSingleObject()来等待信号到来
自定义消息通信:
PostMessage()或PostThradMessage()来发送消息