我们是 MFC 的几个新手,我们正在构建一个多线程应用程序。我们在 URL 中看到警告我们不要使用 CCriticalSection 的文章,因为它的实现被破坏了。我们很想知道是否有人有使用 CCriticalSection 的经验,您是否遇到任何问题或错误?如果我们使用 VC++ 2008 来构建我们的应用程序,CCriticalSection 是否可用并准备好生产?
http://www.flounder.com/avoid_mfc_syncrhonization.htm
谢谢
最佳答案
我认为这篇文章是基于对 CSingleLock 是什么以及如何使用它的根本误解。
您不能多次锁定同一个 CSingleLock,但您不应该这样做。 CSingleLock,顾名思义,用于锁定某物一次。
每个 CSingleLock 只管理其他对象上的一个锁(例如,在构造过程中传递给它的 CCriticalSection),目的是在 CSingleLock 超出范围时自动释放该锁。
如果你想多次锁定底层对象,你可以使用多个 CSingleLocks;您不会使用单个 CSingleLock 并尝试多次锁定它。
错误(他的例子):
CCriticalSection crit;
CSingleLock lock(&crit);
lock.Lock();
lock.Lock();
lock.Unlock();
lock.Unlock();
正确的:
CCriticalSection crit;
CSingleLock lock1(&crit);
CSingleLock lock2(&crit);
lock1.Lock();
lock2.Lock();
lock2.Unlock();
lock1.Unlock();
更好(所以你得到 RAII):
CCriticalSection crit;
// Scope the objects
{
CSingleLock lock1(&crit, TRUE); // TRUE means it (tries to) locks immediately.
// Do stuff which needs the lock (if IsLocked returns success)
CSingleLock lock2(&crit, TRUE);
// Do stuff which needs the lock (if IsLocked returns success)
}
// crit is unlocked now.
(当然,您永远不会像那样故意在单个块中的同一个底层临界区上获得两个锁。这通常只会发生在调用获得锁的函数时,而这些函数已经拥有自己的锁.)
(此外,您应该检查 CSingleLock.IsLocked 以查看锁定是否成功。为了简洁起见,我已经省略了这些检查,因为它们被排除在原始示例之外。)
如果 CCriticalSection 本身也遇到同样的问题,那么这肯定是一个问题,但他没有提供我可以看到的任何证据。 (也许我错过了一些东西。我也无法在我的 MFC 安装中找到 CCriticalSection 的源代码来验证这种方式。)
关于multithreading - Ccriticalsection 在生产中是否可用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4366105/