Ccriticalsection是否可用于生产?

umt*_*g41 3 mfc multithreading visual-c++

我们是MFC中的几个新手,我们正在构建一个多线程应用程序.我们遇到了URL中的文章,该文章警告我们不要使用CCriticalSection,因为它的实现已被破坏.我们有兴趣知道是否有人有使用CCriticalSection的经验,你是否遇到任何问题或错误?如果我们使用VC++ 2008来构建我们的应用程序,CCriticalSection是否可用并且生产就绪?

http://www.flounder.com/avoid_mfc_syncrhonization.htm

谢谢

Leo*_*son 11

我认为这篇文章基于对CSingleLock的基本误解以及如何使用它.

你不能多次锁定相同的CSingleLock,但你不应该这样做.顾名思义,CSingleLock用于锁定ONCE.

每个CSingleLock只管理一个其他对象上的一个锁(例如,在构造期间传递它的CCriticalSection),目的是在CSingleLock超出范围时自动释放该锁.

如果要多次锁定底层对象,可以使用多个CSingleLocks; 你不会使用单个CSingleLock并尝试多次锁定它.

错了(他的例子):

CCriticalSection crit;
CSingleLock lock(&crit);
lock.Lock();
lock.Lock();
lock.Unlock();
lock.Unlock();
Run Code Online (Sandbox Code Playgroud)

对:

CCriticalSection crit;
CSingleLock lock1(&crit);
CSingleLock lock2(&crit);
lock1.Lock();
lock2.Lock();
lock2.Unlock();
lock1.Unlock();
Run Code Online (Sandbox Code Playgroud)

更好(所以你得到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.
Run Code Online (Sandbox Code Playgroud)

(当然,你永远不会故意在一个块中的同一个底层关键部分上获得两个锁.这通常只会因为调用函数而发生,而这些函数在其他已经拥有自己的锁的内部时会获得锁定.)

(此外,你应该检查CSingleLock.IsLocked以查看锁是否成功.为了简洁起见,我已经将这些检查留下了,因为它们被排除在原始示例之外.)

如果CCriticalSection本身遭遇同样的问题,那肯定是一个问题,但他没有提供我能看到的证据.(也许我错过了一些东西.我在MFC安装中找不到CCriticalSection的来源来验证这种方式.)