首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMutex::Lock与CSingleLock::Lock

CMutex::Lock与CSingleLock::Lock
EN

Stack Overflow用户
提问于 2011-05-20 02:20:49
回答 2查看 15.7K关注 0票数 6

我被要求支持一些遗留代码,我看到了一些让我困惑不已的事情。在代码的某些部分中,我看到类实例使用CMutex实例来同步方法执行。例如

代码语言:javascript
复制
class CClassA : public CObject
{
public:
   void DoSomething();

private:
   CMutex m_mutex;
}

void CClassA::DoSomething()
{
   m_mutex.Lock();

   //...logic...

   m_mutex.Unlock();
}

在同一项目的其他地方,我发现代码使用的是CSingleLock

代码语言:javascript
复制
class CClassB : public CObject
{
public:
   void DoSomething();

private:
   CCriticalSection m_crit;
}

void CClassB::DoSomething()
{
   CSingleLock lock(&m_crit);
   lock.Lock();

   //...logic...

   lock.Unlock();
}

回顾MSDN documentation for synchronization之后,CClassB似乎正在实现advised方法,但我并不清楚CClassA使用的实现中有什么危险。据我所知,这两种方法之间的唯一区别是CSingleLock具有RAII的优点,因此当执行退出作用域时锁会自动释放。这两种实现都有其他的优点/缺点吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-24 01:54:29

通常,互斥锁可用于通过命名互斥锁控制跨进程的线程访问,而临界区仅用于同步同一进程空间中的线程访问。

如果不对它们进行包装,这两个类都不能真正获得RAII的好处,因为在这种情况下,您永远不需要显式地调用lock或unlock。举个例子,这里有一小段使用boost互斥锁的伪代码...

代码语言:javascript
复制
void DoSomething()
{
  // construction acquires lock on mutex
  boost::scoped_lock lock(&aBoostMutex);

  // ...

} // end scope - object is destroyed and lock is released

现在,我认为您应该避免使用CMutexCCritalSectionCSemaphoreCEvent,因为它们的实现都有些问题,或者至少不如boost等其他可用的库。例如:

  • 无法从已放弃的互斥锁中确定超时,因为实现检查只返回值而不检查原因。
  • 没有使用CSingleLock的可重入锁,因此递归会导致issues.
  • Inability在进程之间有一个命名事件

根据你的任务,你可能有机会摆脱windows API上的MFC包装器,实现你自己的原子锁,或者使用像boost或者像std::mutex这样的C++0x特性,它们不仅是更好的实现,而且提供跨平台支持。

票数 2
EN

Stack Overflow用户

发布于 2011-05-20 02:27:02

临界区仅对单个进程内的线程可见/可用。互斥锁可以跨多个进程可见(通常通过创建命名互斥锁)。您上面所展示的内容不足以说明这是否是他们两者兼得的原因,但这是一种可能性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6063113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档