1
1
编辑 :我个人认为下面的代码在技术上正确地回答了您的问题(如中所述,它提供了一种在不创建副本的情况下枚举集合中的值的方法)。一些开发商的声誉远比我强烈建议的要高 反对 出于他们在编辑/评论中解释的原因,这种方法。简而言之: 这显然是个坏主意。 所以我留下答案,但建议你不要用它。
除非我漏掉了什么,我相信你可以把你的价值观
但是,请注意(我猜您已经知道了),这种方法提供了
懒惰的评价
,这意味着
换句话说…好吧,看看这段代码(我当然是在猜测你这类代码的一些细节):
所以如果要求
(开始280Z28):下面是一个不熟悉“做事方式”的人如何锁定代码的示例:
(280Z28结束) |
2
9
你有三个选择。 1)复制数据,分发副本。优点:不用担心线程安全访问数据。缺点:客户端得到的是过期数据的副本,而不是最新数据的副本。而且,复印也很贵。 2)分发一个对象,该对象在读取基础集合时将其锁定。您必须编写自己的只读集合,该集合引用“父”集合的锁。仔细设计这两个对象,这样就不可能出现死锁。优点:从客户的角度来看,它“工作正常”;它们可以获得最新的数据,而不必担心锁定问题。缺点:给你更多的工作。 3)把问题推给客户。公开锁,并要求客户端在使用之前锁定数据本身上的所有视图。优点:没有你的工作。缺点:为客户做更多的工作,他们可能不愿意或不能做的工作。死锁等风险,现在成了客户的问题,而不是你的问题。 |
3
2
如果你想
快照
在字典的当前状态中,您确实无法使用此集合类型执行其他操作。这与
如果你不介意扔一个
|
4
0
查看下一个可能性,只公开ICollection接口,因此在values()中可以返回自己的实现。此实现将仅对dictioanry.values使用引用,并始终对访问项使用readlock。 |
Eric · fgets_unlocked()用于多线程读取不同文件 2 年前 |
RoyGNEU · 堆上的专用std::Vector是线程安全的吗? 2 年前 |
JaiK · 在c中使用线程或队列写入文件# 6 年前 |
Catalin Ghita · 如何以安全线程对象为值初始化哈希表? 6 年前 |
Juan JuezSarmiento · C++删除对象,是否锁定? 6 年前 |
Missa · 两个不同线程正在处理原子NSMutableArray 6 年前 |
user5682282 · 从其他线程读取值 6 年前 |