gpt4 book ai didi

c++ - CMutex::Lock 与 CSingleLock::Lock

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:44 27 4
gpt4 key购买 nike

我被要求支持一些遗留代码,我看到了一些让我摸不着头脑的事情。在某些代码段中,我看到类实例使用 CMutex 实例来同步方法执行。例如

class CClassA : public CObject
{
public:
void DoSomething();

private:
CMutex m_mutex;
}

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

//...logic...

m_mutex.Unlock();
}

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

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 正在实现建议的方法,但我不清楚 CClassA 使用的实现有什么危险。据我所知,这两种方法之间的唯一区别是 CSingleLock 具有 RAII 的优势,因此当执行退出范围时锁会自动释放。这两种实现方式还有其他优点/缺点吗?

最佳答案

通常,互斥量可用于通过命名互斥量控制跨进程的线程访问,而关键部分仅用于同步同一进程空间中的线程访问。

如果不对它们进行包装,这些类都无法真正获得 RAII 的好处,因为在那种情况下,您永远不需要显式调用锁定或解锁。以使用增强互斥锁的这段伪代码为例...

void DoSomething()
{
// construction acquires lock on mutex
boost::scoped_lock lock(&aBoostMutex);

// ...

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

现在我认为您应该避免使用 CMutexCCritalSectionCSemaphoreCEvent,因为这些实现有些损坏或至少不如其他可用的库,如 boost。例如:

  • 确定放弃互斥体的超时是不可能的,因为实现只检查返回值而不是原因。
  • 没有使用 CSingleLock 的可重入锁,因此递归会导致问题。
  • 无法在进程之间有命名事件

根据您的任务,您可能有机会摆脱 Windows API 上的 MFC 包装器并实现您自己的原子锁或使用类似 boost 或 C++0x 功能的东西,例如 std::mutex 这不仅是更好的实现,而且提供跨平台支持。

关于c++ - CMutex::Lock 与 CSingleLock::Lock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6063113/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com