代码之家  ›  专栏  ›  技术社区  ›  John Warlow

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

  •  6
  • John Warlow  · 技术社区  · 14 年前

    最近几年我一直在使用C语言,现在我正在C++中进行错误修复。 在C中,我可以使用对象上的锁来确保代码线程的安全:

    lock(lockObject)
    {
        // Do some work
    }
    

    如果在 // Do some work

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

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

    但我不喜欢花括号只是为了给我的 AutoLock . 现在我在做:

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

    如果在 //Do some work .

    我现在所做的是有效的,但我想知道是否有更好的方法,谢谢。

    2 回复  |  直到 14 年前
        1
  •  8
  •   James McNellis    14 年前

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

    这就是它在C++中的实现方式。

    请注意,您不需要为每个 自动锁 ;以下也可以:

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

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

    当你完成互斥锁时,你手动解锁的方法很好,但是它不是惯用的C++,也不是很清楚。这使得很难确定互斥锁是在哪里解锁的(可能不太难,但比需要的难)。

        2
  •  2
  •   Björn Pollex    14 年前

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