其实,关于同步,主要想讲的是 CSingleLock 类。
由于 CSingleLock 是个全局类,没父类,没子类,从下面的关系图中可以看出。
于是,我们就转向了将 CSingleLock 作为友元函数的 CSyncObject 类。
这样,CSingleLock 就共享到了 CSyncObject 里面的对象了。
所以,我们对这些逐一介绍,以获得 CSingleLock 的理解。
一、同步类在MFC中的位置状况:
CObject>>CMultiLock
>>CSingleLock
>>CSyncObject>>CCriticalSetion(临界区)
>>CMutex(互斥)
>>CEvent(事件)
>>CSemaphore(信号量)
在这里我们可以看到,后面四类貌似很熟悉吧,是的,它们就是前面提到的线程的同步对象。
二、CSyncObject
1、纯虚类,作为具体同步类的基类,它只作为一个接口使用
2、有两个关键的成员函数Lock()、UnLock(),CSyncObject后面的四类都通过这两个统一接口进行同步操作。
1)不带参数的 UnLock() 是纯虚函数,在CSyncObject类中没有实现,各子类必须根据需要给出各自的实现。
2)带参数的 UnLock(),默认情况下都返回TRUE。
3、构造函数有:
1)CSyncObject::CSyncObject(LPCTSTR pstrName)
2)CSyncObject::~CSyncObject()
3)CSyncObject::Lock(DWORD dwTimeOut)
4、在CSyncObject类的声明后有:
friend class CSingleLock;
friend class CMultiLock;
说明这两类是它的友函数,可以互相访问类里的内容。
三、CSingleLock
1、全局类,没有父类,没有子类。
2、由于友元作用,它可以使用CSyncObject类中的4个对象。
3、与 CMultiLock 的区别是:当一次只要等待一个对象时,用 CSingleLock;
多个对象时,用 CMultiLock。
4、构造函数有:
1)CSingleLock::CSingleLock(CSyncObject* pObject, BOOL bInitialLock)
2)BOOL CSingleLock::Lock(DWORD dwTimeOut)
3)BOOL CSingleLock::Unlock() //无参数
4)BOOL CSingleLock::Unlock(LONG lCount,LPLONG lpPrevCount) //有参数
5、用法:
CSingleLock singleLock(&m_CritSetion);//创建一个CSingleLock对象
singleLock.Lock();//试图获得共享资源
if(singleLock.IsLocked()) //判断共享资源是否被锁定
{……}
singleLock.UnLock(); //解锁共享资源。其实有两个解锁函数,有无参数的区别,后面讲。
四、CMultiLock
1、由于友元作用,它可以使用CSyncObject类中的4个对象。
2、构造函数有:
1)CMultiLock::CMultiLock(CSyncObject* pObject[],DWORD dwCount,BOOL bInitialLock)
2)CMultiLock::~CMultiLock()
3)BOOL CMultiLock::Unlock() //无参数
4)BOOL CMultiLock::Unlock(LONG lCount,LPLONG lpPrevCount) //有参数
5)AFXMTINLINE BOOL CMultiLock::IsLocked(DWORD dwObject)
3、使用:
CEvent event1,event2,event3; //声明3个事件
CSingleLock *eventObject[]={ &event1 , &event2 , &event3};
CMultiLock lock (eventObject,3);
lock.Lock();
//动作
lock.Unlock();