![]() |
1
28
[ ] 答案已编辑 ] 基本上,使用带有可变互斥体的const方法是一个好主意(不要顺便返回引用,确保按值返回),至少表明它们不修改对象。互斥体不应该是常量,将锁定/解锁方法定义为常量将是一个无耻的谎言。
事实上,这(和记忆化)是我所看到的
您还可以使用对象外部的互斥体:安排所有方法都是可重入的,并让用户自己管理锁:
它的优点是不需要两个互斥锁(并且可以保证对象的状态不会改变)。 |
![]() |
2
49
隐藏的问题是:您将互斥体放在哪里来保护您的类? 作为一个总结,假设您想要读取受互斥保护的对象的内容。 “read”方法在语义上应该是“const”,因为它不会改变对象本身。但要读取该值,需要锁定互斥体,提取该值,然后解锁互斥体,这意味着必须修改互斥体本身,这意味着互斥体本身不能是“const”。 如果互斥体是外部的然后一切都好了。对象可以是“const”,互斥体不需要是:
imho,这是一个糟糕的解决方案,因为任何人都可以重用互斥体来保护其他东西。包括你。事实上,您将背叛自己,因为如果您的代码足够复杂,您将对这个或那个互斥体到底保护什么感到困惑。 我知道:我是那个问题的受害者。 如果互斥体是内部的出于封装目的,您应该尽可能地将互斥体放在它所保护的对象附近。 通常,您将编写一个包含互斥体的类。但迟早,您将需要保护一些复杂的STL结构,或者由另一个内部没有互斥的人编写的任何东西(这是一件好事)。 这样做的一个好方法是使用继承模板派生原始对象,并添加互斥功能:
这样,你就可以写:
问题是它不起作用,因为
困境
如果你相信
解决办法是承认
然后,必须声明互斥体可变,以及锁定/解锁方法
内部互斥解决方案是一个很好的解决方案:一方面必须声明一个靠近另一个的对象,另一方面将两个对象聚合到包装器中,最终是相同的事情。 但这种聚合有以下优点:
因此,将互斥体尽可能靠近互斥对象(例如,使用上面的互斥构造),然后转到
编辑2013-01-04
显然,Herb Sutter也有同样的观点:他对
http://herbsutter.com/2013/01/01/video-you-dont-know-const-and-mutable/ |
![]() |
Sam Estep · 这是瞬态的正确用法吗? 7 年前 |
![]() |
s952163 · 递归地将列表解压缩为元素 9 年前 |
![]() |
chris · 在Haskell中创建可变Data.Vector 11 年前 |
|
Ned · 用Java实现数字系统:可变与不可变 11 年前 |
![]() |
6c656c · 具有多个文件的记录的可变字段 12 年前 |