如何捕获临界区中抛出的异常?

Uin*_*e81 4 c++ winapi multithreading exception

我正在使用c ++进行win 32多线程处理.场景:我有一个多线程使用的函数.此函数作为关键部分(或任何可以锁定资源的构造).在临界区中抛出异常.此时我需要注意在异常catch块中解锁资源.

有没有其他办法可以做到这一点?我的意思是,让我们说我不想记得在catch块中释放锁,是否有任何常见的方法来处理这个问题以避免这种容易出错的情况?

D.S*_*ley 16

想法是封装在对象中获取和释放关键部分的行为,使得构造对象获取CS并且销毁对象释放它.

struct CSHolder {
    explicit CSHolder(CRITICAL_SECTION& cs): lock(cs) {
        ::EnterCriticalSection(&lock);
    }
    ~CSHolder() { ::LeaveCriticalSection(&lock); }
    CRITICAL_SECTION& lock;
};


CRITICAL_SECTION gLock;
void foo() {
    CSHolder lockIt(gLock);
    // lock is held until lockIt is destroyed
}
Run Code Online (Sandbox Code Playgroud)

该概念称为RAII - 资源获取是初始化.它是现代C++中非常常见的习语.