c++ - 对象级 CSingleLock 与方法级 CSingleLock

标签 c++ multithreading asynchronous mfc locking

我有一个声明 CCriticalSection 对象的类。为简单起见,假设一次只有一个线程进入并执行该类的方法。

我的问题是,

我声明类级别 CSingleLock 并使用它的 Lock() 和 Unlock() 方法与我在每个函数中声明 CSingleLock 对象有什么不同吗?

class ExclusiveClass
{
    CCriticalSection mCS;
    CSingleLock      mSL;
    ExclusiveClass() : mCS(), mSL(&mCS) { }
    void someMethod 
    {
        mSL.Lock();
        // Do whatever you want
        mSL.Unlock();
    }
}

对比

class ExclusiveClass
{
    CCriticalSection mCS;
    ExclusiveClass() : mCS() {}
    void someMethod 
    {
        CSingleLock sl(&mCS);
        sl.Lock()
        // Do whatever you want
        sl.Unlock();
    }
}

我知道一个明确的区别。在第二种方法中,我们不需要显式调用 Unlock() 方法。从函数返回时,sl 的析构函数将被调用,方法锁将自动解锁。

我关心的是异常(exception)情况。当异常发生时,我确信第二种方法会自动解锁。第一种方法呢?还有其他区别吗?

最佳答案

您的第一个示例不是异常安全的。如果在 Lock 之后但在调用 Unlock 之前抛出异常,您将永远不会释放锁,这很糟糕!

对于这种模式,您应该使用 RAII您在第二个示例中展示的方法。它不仅是异常安全的,而且让您不必担心调用 Unlock,您很容易忘记这样做,并且会遇到一些难以追踪的错误。

关于c++ - 对象级 CSingleLock 与方法级 CSingleLock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22668250/

相关文章:

node.js - 如何串行链接http请求函数

c++ - 循环 - 访问冲突写入位置 0xabababab

c++ - 按值返回不创建新对象

C++11 线程卡在锁定互斥锁上

具有(非常)快速和可靠切换的 C++ 生产者消费者队列

javascript - jQuery 多种方法等待

c++ - 在 netbeans 中包含 hdf5 的库

默认使用 C++11?

python - 添加多线程或异步到网络抓取

javascript - 为什么这个 JavaScript async/await 代码没有按预期运行?