我编写了一个类,其实例可以由多个线程访问。我使用了一个技巧来记住用户在使用对象之前必须锁定该对象。它涉及仅保留 const 实例。当需要读取或修改敏感数据时,其他类应该调用一个方法(该方法是 const,因此允许)来获取锁定对象的非 const 版本。实际上它返回一个代理对象,其中包含一个指向非常量对象的指针和一个scoped_lock,因此当超出范围时它会解锁该对象。代理对象还重载了operator->,因此对对象的访问是透明的。
这样,通过访问未锁定的对象来射击自己的脚就更困难了(总是有 const_cast)。
应该避免“聪明的把戏”,而且这无论如何都很难闻。
这个设计真的很糟糕吗? 我还能做什么或应该做什么?
编辑: getter 是非常量的以强制锁定。
最佳答案
基本问题:非常量引用可能存在于其他地方。如果安全地写入,并不意味着它可以安全地读取——您可能会看到中间状态。
此外,某些 const 方法可能(合法)以线程不安全的方式修改隐藏的内部细节。
分析您实际对该对象执行的操作并find an appropriate synchronisation mode .
如果您的聪明容器确实对对象有足够的了解,可以通过代理控制它们的所有同步,那么请将这些对象设为私有(private)内部类。
关于c++ - 我应该使用 const 来使对象线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7402345/