我正在考虑创建一个表示同步原语所有权的类,如下所示:
class CCriticalSectionLock
{
public:
CCriticalSectionLock( CCriticalSection &cs ) : cs( cs )
{ cs.Enter(); }
~CCriticalSectionLock()
{ cs.Leave(); }
private:
CCriticalSection &cs;
};
这看起来是一种能够在函数期间取得所有权并确保所有权被释放的好方法,即使存在多个退出点或异常也是如此。然而,它确实引发了一些微妙的问题,即编译器何时会对各种事物进行评估。考虑以下用途:
int MyMethod( void )
{
not_locked(); // do something not under lock
CCriticalSectionLock myLock( someCriticalSection );
locked(); // do something under lock
return ...; // some expression
}
AFAIK,C++ 生命周期规则将保证在获取锁之前not_locked()
调用它,并且在持有锁时调用它。locked()
但是,我不太清楚的是,何时返回的表达式将相对于调用锁析构函数的点进行评估。是否保证表达式将在析构函数之前被评估?我会这么认为,但我不是 100% 确定,否则可能会导致非常微妙、间歇性、难以发现的错误!