c++ - 我应该使用 const 来使对象线程安全吗?

标签 c++ locking constants

我编写了一个类,其实例可以由多个线程访问。我使用了一个技巧来记住用户在使用对象之前必须锁定该对象。它涉及仅保留 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/

相关文章:

用于字符串的内部 API 的 Pythonic 方法

c# - 非平凡数据类型的预定义常量

c++ - 使用 const public 成员强制所有实例的不变性是否合理?

c++ - 使用 C++ 在数组中查找不同的元素

c++ - 编写程序获取 CPU 缓存大小和级别

c++ - 如何在生成依赖文件中包含 IBM XLC 模板 *.c 文件?

接受 array.begin() 和 array.end() 作为参数的 C++ 函数

assembly - 关于多核CPU的x86 LOCK问题

java - 乐观锁 - Hibernate 的并发问题

ruby-on-rails - NoMethodError(未定义方法 `locked'