gpt4 book ai didi

multithreading - Ccriticalsection 在生产中是否可用?

转载 作者:行者123 更新时间:2023-12-01 08:18:28 25 4
gpt4 key购买 nike

我们是 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/

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