使用C ++中的范围自动锁定/解锁(来自C#背景)

时间:2010-07-19 15:58:24

标签: c++ exception-handling

过去几年我一直在使用C#,目前我正在使用C ++修复错误。 在C#中,我可以使用对象的锁来使我的代码线程安全:

lock(lockObject)
{
    // Do some work
}

如果// Do some work

中有异常,这将解锁lockOject

C ++中有类似的东西吗?目前我可以想到:

// Code
{
    AutoLock lock(lockObject);
    // Do some work
}
// More Code

但我不喜欢花括号只是为了AutoLock的范围。目前我正在做:

AutoLock lock(lockObject);
// Do some work
lock.Unlock();

如果//Do some work中存在异常,则允许异常展开释放锁定。

我现在正在做的事情,但我想知道是否有更好的方法,谢谢。

2 个答案:

答案 0 :(得分:8)

  

但我不喜欢花括号只是为了AutoLock范围。

这就是用C ++完成的。

请注意,每个AutoLock都不需要单独的范围块;以下情况也很好:

{
    AutoLock lock1;
    AutoLock lock2;
    // more code goes here
} // lock2 gets destroyed, then lock1 gets destroyed

它也不必是一个单独的范围块;如果你在一个函数中锁定某些东西并且在函数返回之前不需要它被解锁,那么你可以简单地使用函数范围来约束锁。同样,如果您在循环块中的每次迭代期间锁定某些内容,则可以使用循环的范围块来约束锁定。

完成它后手动解锁互斥锁的方法很好,但它不是惯用的C ++而且不那么明确。这使得更难以确定互斥锁的解锁位置(可能不是更难,但可能比它需要的更难)。

答案 1 :(得分:2)

你的第二个版本很好。如果您有太多仅用于范围锁定的大括号,请考虑拆分您的方法。阅读RAII,这是该技术背后的一般模式,它可以应用于各种资源管理。