Windows MFC的同步类 http://blog.sina.com.cn/s/blog_627ebfc30100iman.html

Windows MFC的同步类

  (2010-05-21 13:34:29)
标签: 

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();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值