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

JLW*_*low 6 c++ exception-handling

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

lock(lockObject)
{
    // Do some work
}
Run Code Online (Sandbox Code Playgroud)

如果在其中有异常,这将解锁lockOject // Do some work

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

// Code
{
    AutoLock lock(lockObject);
    // Do some work
}
// More Code
Run Code Online (Sandbox Code Playgroud)

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

AutoLock lock(lockObject);
// Do some work
lock.Unlock();
Run Code Online (Sandbox Code Playgroud)

如果有异常,让异常展开释放锁定//Do some work.

我现在正在做什么,但我想知道是否有更好的方式,谢谢.

Jam*_*lis 8

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

这就是用C++完成的.

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

{
    AutoLock lock1;
    AutoLock lock2;
    // more code goes here
} // lock2 gets destroyed, then lock1 gets destroyed
Run Code Online (Sandbox Code Playgroud)

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

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