MFC CSyncObject,CSingleLock,CMultiLock同步类

其实,关于同步,主要想讲的是 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();

MFC CSingleLock CMultiLock CSyncObject

分享到:
评论加载中,请稍后...
创APP如搭积木 - 创意无限,梦想即时!
回到顶部