我被要求支持一些遗留代码,我看到了一些让我困惑不已的事情。在代码的某些部分中,我看到类实例使用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似乎正在实现advised方法,但我并不清楚CClassA使用的实现中有什么危险。据我所知,这两种方法之间的唯一区别是CSingleLock具有RAII的优点,因此当执行退出作用域时锁会自动释放。这两种实现都有其他的优点/缺点吗?
发布于 2011-05-24 01:54:29
通常,互斥锁可用于通过命名互斥锁控制跨进程的线程访问,而临界区仅用于同步同一进程空间中的线程访问。
如果不对它们进行包装,这两个类都不能真正获得RAII的好处,因为在这种情况下,您永远不需要显式地调用lock或unlock。举个例子,这里有一小段使用boost互斥锁的伪代码...
void DoSomething()
{
// construction acquires lock on mutex
boost::scoped_lock lock(&aBoostMutex);
// ...
} // end scope - object is destroyed and lock is released现在,我认为您应该避免使用CMutex、CCritalSection、CSemaphore和CEvent,因为它们的实现都有些问题,或者至少不如boost等其他可用的库。例如:
CSingleLock的可重入锁,因此递归会导致issues.根据你的任务,你可能有机会摆脱windows API上的MFC包装器,实现你自己的原子锁,或者使用像boost或者像std::mutex这样的C++0x特性,它们不仅是更好的实现,而且提供跨平台支持。
发布于 2011-05-20 02:27:02
临界区仅对单个进程内的线程可见/可用。互斥锁可以跨多个进程可见(通常通过创建命名互斥锁)。您上面所展示的内容不足以说明这是否是他们两者兼得的原因,但这是一种可能性。
https://stackoverflow.com/questions/6063113
复制相似问题