通过在头文件中使用块来限制互斥锁的范围
限制互斥锁的范围是通过在头文件中使用块的方法。互斥锁不会锁定成员变量,它锁定的是代码。它只有在锁定访问成员变量的唯一代码时才能锁定成员变量。也就是说,将锁放在访问函数(get/set)中,并且不允许以其他方式访问成员变量。
在每个getter和setter中使用互斥锁将确保所有线程看到变量的最新更新,但实际上不提供任何互斥保护。想象一个具有成员变量A、B和C的对象,其中A+B+C必须始终等于零。锁定A、B和C的getter和setter将无法保护这个不变量,因为在各个get和set之间没有锁定任何东西。您必须在调整值的整个时间保持锁定,并且在关心总和为零的整个时间保持锁定。
你所说的是对的。然而,在给定的例子中,我只看到一个被引用的共享变量。我并不打算让我的答案成为使用互斥锁的规范方法,只是为了纠正这里的原则误解。也就是说,互斥锁不会锁定数据,而是锁定访问数据的代码。维护数据的完整性和不变性是该代码的责任,是的,但这不是我回答的重点。
让setter和getter锁定互斥锁并不是真正的答案,因为我希望成员函数无论如何都能访问已锁定的互斥锁。但是,谢谢你的建议。