通过在头文件中使用块来限制互斥锁的范围

13 浏览
0 Comments

通过在头文件中使用块来限制互斥锁的范围

我有一个类,它有自己的工作线程,并且类的一些成员变量在主线程和工作线程之间共享。我如何使用互斥锁只锁定正在共享的成员变量?

例如,下面的代码是无效的(因为该块作用域在任何函数之外)。

class Foo {
public:
    // 一些内容
private:
    boost::thread *m_worker;
    Bar m_bar_nonshared;
    {
        boost::mutex m_mutex;
        Bar m_bar_shared;
    }
};

0
0 Comments

限制互斥锁的范围是通过在头文件中使用块的方法。互斥锁不会锁定成员变量,它锁定的是代码。它只有在锁定访问成员变量的唯一代码时才能锁定成员变量。也就是说,将锁放在访问函数(get/set)中,并且不允许以其他方式访问成员变量。

在每个getter和setter中使用互斥锁将确保所有线程看到变量的最新更新,但实际上不提供任何互斥保护。想象一个具有成员变量A、B和C的对象,其中A+B+C必须始终等于零。锁定A、B和C的getter和setter将无法保护这个不变量,因为在各个get和set之间没有锁定任何东西。您必须在调整值的整个时间保持锁定,并且在关心总和为零的整个时间保持锁定。

你所说的是对的。然而,在给定的例子中,我只看到一个被引用的共享变量。我并不打算让我的答案成为使用互斥锁的规范方法,只是为了纠正这里的原则误解。也就是说,互斥锁不会锁定数据,而是锁定访问数据的代码。维护数据的完整性和不变性是该代码的责任,是的,但这不是我回答的重点。

让setter和getter锁定互斥锁并不是真正的答案,因为我希望成员函数无论如何都能访问已锁定的互斥锁。但是,谢谢你的建议。

0