最近几年我一直在使用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中存在异常,则让异常平移释放锁。

我目前正在做什么,但是我想知道是否有更好的方法,谢谢。

最佳答案



这就是在C++中完成的方式。

注意,您不需要为每个AutoLock都有单独的作用域块;以下也可以:

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

它也不必是单独的作用域块。如果您要锁定某个函数中的某个东西,并且在该函数返回之前不需要将其解锁,那么您可以简单地使用函数作用域来约束该锁。同样,如果您在循环块的每次迭代过程中都锁定了某个对象,则可以使用循环的作用域块来约束锁定。

完成操作后,手动解锁互斥锁的方法很好,但是它不是C++惯用的语言,也不清楚。这样就很难确定互斥锁的解锁位置(也许不难,但比所需的要难得多)。

关于c++ - 使用C++中的范围自动锁定/解锁(从C#后台开始),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3282728/

10-12 18:20