none
请问VC++中如何实现类似与c#中的lock功能? RRS feed

  • 问题

  • 请问VC中如何实现类似与c#中的lock功能?即:
    lock(object)
    doSomeThing();

    不过doSomeTing是否发生异常,锁都可以被释放?
    MFC 有类似CLock的东西,但感觉用起来还是不太舒服.
    2009年9月9日 9:14

答案

  • 下面是具体实现:类似synchronized(mutex){........}

    //自定义的Mutext类
    Mutex::Mutex(void)
    {
    InitializeCriticalSection(&m_criticalSection);
    }

    Mutex::~Mutex(void)
    {
    DeleteCriticalSection(&m_criticalSection);
    }

    void Mutex::Lock()
    {
    EnterCriticalSection(&m_criticalSection);
    }

    void Mutex::UnLock()
    {
    LeaveCriticalSection(&m_criticalSection);
    }

    private:
    CRITICAL_SECTION m_criticalSection;

    //自定义的Lock类
    Lock::Lock(Mutex &mutex): m_mutex(mutex), m_locked(true)
    {
    m_mutex.Lock();
    }

    Lock::~Lock(void)
    {
    m_mutex.UnLock();
    }

    void Lock::SetUnlock()
    {
    m_locked = false;
    }

    Lock::operator bool() const
    {
    return m_locked;
    }
    private:
    Mutex &m_mutex;
    bool m_locked;

    宏定义: #define synchronized(M)  for(Lock M##_lock = M; M##_lock; M##_lock.SetUnlock())

    调用为:
    Mutex mutex1;
    synchronized(mutex)
    {
    //......即使这里发生异常也能保证mutex能释放掉。经过测试貌似没有什么问题。
    }
    //end

    但有个问题没有解决,synchronized只能锁住我自定义的那个Mutex对象。这样如果我要锁定一个集合的话必须为这个集合在定义一个Mutex对象,稍微有点点麻烦。不过基本上也够用了。。。。。
    • 已标记为答案 vieri122 2009年9月11日 4:56
    2009年9月10日 4:30

全部回复

  • 你可以调用API.
    EnterCriticalSection
    LeaveCriticalSection
    这两个函数是加锁的最基本函数。


    0xBAADF00D
    2009年9月9日 15:02
    版主
  • How to: Implement the lock C# Keyword in C++

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2009年9月9日 17:49
    版主
  • 回复楼上的,这个我看过,但好像是托管的吧 using namespace System::Threading; 在vc++中报错
    2009年9月10日 0:26
  • 是托管的。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2009年9月10日 2:08
    版主
  • 可以自己实现一个比较好用的c++ lock类
    比如使用mfc的synobj时定义这么一个类
    #include <afxmt.h>

    class CAutoLock
    {
    public:
     explicit CAutoLock(CSyncObject *pLockObj)
     {
      m_pLockObj = pLockObj;
      if (m_pLockObj)
      {
       m_pLockObj->Lock();
      }
     }

     ~CAutoLock()
     {
      if (m_pLockObj)
      {
       m_pLockObj->Unlock();
      }
     }

    private:
     CSyncObject *m_pLockObj;
    };

    使用(注:extern CCriticalSection lock_object;):
    需要lock时
    {
       CAutoLock cObjectLock(&lock_object)
       doSomeThing();

    2009年9月10日 3:02
  • 谢谢楼上的,昨天参考了网上的一些资料,自己写了一个纯VC++的,现在还在测试阶段,等稳定了在发出来
    2009年9月10日 3:53
  • 下面是具体实现:类似synchronized(mutex){........}

    //自定义的Mutext类
    Mutex::Mutex(void)
    {
    InitializeCriticalSection(&m_criticalSection);
    }

    Mutex::~Mutex(void)
    {
    DeleteCriticalSection(&m_criticalSection);
    }

    void Mutex::Lock()
    {
    EnterCriticalSection(&m_criticalSection);
    }

    void Mutex::UnLock()
    {
    LeaveCriticalSection(&m_criticalSection);
    }

    private:
    CRITICAL_SECTION m_criticalSection;

    //自定义的Lock类
    Lock::Lock(Mutex &mutex): m_mutex(mutex), m_locked(true)
    {
    m_mutex.Lock();
    }

    Lock::~Lock(void)
    {
    m_mutex.UnLock();
    }

    void Lock::SetUnlock()
    {
    m_locked = false;
    }

    Lock::operator bool() const
    {
    return m_locked;
    }
    private:
    Mutex &m_mutex;
    bool m_locked;

    宏定义: #define synchronized(M)  for(Lock M##_lock = M; M##_lock; M##_lock.SetUnlock())

    调用为:
    Mutex mutex1;
    synchronized(mutex)
    {
    //......即使这里发生异常也能保证mutex能释放掉。经过测试貌似没有什么问题。
    }
    //end

    但有个问题没有解决,synchronized只能锁住我自定义的那个Mutex对象。这样如果我要锁定一个集合的话必须为这个集合在定义一个Mutex对象,稍微有点点麻烦。不过基本上也够用了。。。。。
    • 已标记为答案 vieri122 2009年9月11日 4:56
    2009年9月10日 4:30