写点什么

枚举并发集合探讨

  • 2008-09-03
  • 本文字数:1288 字

    阅读完需:约 4 分钟

.NET 的并行扩展(Parallel Extensions)包括两个并发集合:堆栈和队列。其他集合类还是按照它们固有的方式工作,但是对于语义的处理依然有一些挥之不去的问题。尤其是当集合在一个线程被编辑,而在另外一个线程被枚举的时候,会发生什么呢?

对于单线程的类,答案是众所周之的,枚举器将抛出一个异常。不过对于并发类来说,在这种情况下应该设定一种规则,提供几种选择。

一种选择是,在枚举开始的时候为现存数据创建一个快照。这种方式在循环的过程中会占用更多的内存,不过快照一旦被创建,就可以被自由地锁定。这种方式下隐含的性能问题很难被预估。

不使用快照,集合还有一组保证措施提供给开发人员。它们中很多都是自相矛盾的,不过在某些条件下它们也都是适合的。

  • 删除的条目总是可读
  • 删除的条目不可再读
  • 如果添加在集合的末尾,那么添加的条目总是可读
  • 如果添加在集合的任何地方,那么添加的条目总是可读
  • 添加的条目总是不可读取
  • 被移动的条目,不能被读取两次
  • 被移动的条目,如果是移动到集合的末尾,那么就能被读取两次
  • 被移动的条目,就算是被移动到集合的开头,也总是可以读取
  • 不超过 N 条的条目就能被读取,而 N 是集合的初始大小。

在给出一个选择范围后, Stephen Toub 向大家征询关于并行扩展的反馈意见

  1. 鉴于在.NET 中已经存在一些标准的集合类了,假如你已经具有它们的线程安全(thread-safe)版本,那么什么样的情形下,你才可以从能并发地枚举同一个被其它线程同时编辑的集合中获得好处?我们虽然对此已经有所了解,不过还是很想多听听大家的意见。
  2. 假设你确实具有第一条提到的情形,那么为了让从枚举器中返回的数据是可用的,你大概需要的最小保证措施是什么?例如,对于一个字典对象如果不存在并发编辑(添加 / 更新 / 删除),你可以认为它是线程安全的,你将能在枚举过程中准确地得到字典中的内容;然而,如果存在并发访问,你再也不能得到已经不存在于字典中的内容,你可能看不到并发添加或更新的东西,也可能依然能看到那些被并发地删除的条目。
  3. 如果我们确实支持在线程安全的集合上进行面向并发编辑的枚举操作,那么你希望能够从“在并发编辑上抛出异常”这样的行为中恢复之前的操作吗?
  4. 最后,你期望看到的既线程安全又能实现可伸缩副本的集合中,哪个最重要?

Omer van Kloeten 对于序列化,提出了一个重要的问题,

一个重要的附加功能是能够异步地转储(dump),即有时为了备份可以把内存的数据缓存到持久性存储,这就要求线程安全的枚举过程。(实际上,想一想——是否也能线程安全地序列化?这样的话什么才是默认的行为呢?)

Rick Brewster 则建议我们求助于函数式编程概念。代替在外部锁定集合的方式,所有对集合的并发操作都能通过给“Lock(Action)”方法传递一个委托来执行。

这个点子就是让“Lock”方法自动地用 lock/unlock 这样的结构把你的回调包围起来。这种方法也不会限制你使用这些类当前已经暴露出来的原子操作。实际上,也许让 Lock 来获得 Func 而非 Action 更好,并且 ConcurrentList 类本身不真正具有任何用于 get、set、enumerate 的方法。使用这种方式,你就只能访问在锁定范围内的类。

查看英文原文: Enumerating Concurrent Collections

2008-09-03 20:041290
用户头像

发布了 254 篇内容, 共 71.7 次阅读, 收获喜欢 2 次。

关注

评论

发布
暂无评论
发现更多内容

干货下载 |《数据治理:数据中台建设与能力提升策略》

博睿数据

预告|博睿数据将受邀出席GOPS全球运维大会北京站!

博睿数据

pytest 参数化测试用例

测吧(北京)科技有限公司

测试

视频生成模型 Dream Machine 开放试用;微软将停止 Copilot GPTs丨 RTE 开发者日报 Vol.224

RTE开发者社区

掌握JMeter:深入解析如何提取和利用JSON数据

霍格沃兹测试开发学社

一杯咖啡的艺术 | 如何利用数字孪生技术做出更美味的意式浓缩咖啡?

Altair RapidMiner

人工智能 数据分析 数字孪生 altair

吞吐量10倍提升!分布式文件系统性能优化创新方案

焱融科技

英特尔旗下子公司发布OLEA U310 SoC

E科讯

英特尔发布AI创作应用AI Playground,将于今夏正式上线!

E科讯

ICE.AI市场需求与愿景

科技汇

TXT文本一键转思维导图!这3款AI软件不容错过

彭宏豪95

人工智能 思维导图 在线白板 办公软件 AIGC

618大促背后的智能力量:天润融通如何用AI大模型提升客户服务?

天润融通

人工智能 天润融通

AI “黏土画风”轻松拿捏,手把手带你云端部署 ComfyUI

阿里巴巴云原生

阿里云 云原生

焱融科技参编国内首个高性能计算存储标准

焱融科技

Word文档中如何做思维导图?2个实用技巧推荐,办公必备!

彭宏豪95

效率工具 思维导图 word 在线白板 办公软件

深入探索Chrome开发者工具:开发者的利器

霍格沃兹测试开发学社

企业上云的优点、难点及SD-WAN解决方案的探讨

Ogcloud

SD-WAN 企业组网 SD-WAN组网 SD-WAN服务商 SDWAN

使用Postman发送POST请求的指南

霍格沃兹测试开发学社

Windows电脑安装Apache JMeter的详细教程

霍格沃兹测试开发学社

eFuse电子保险丝,需要了解的技术干货来啦

芯动大师

电源 电子保险丝 efuse

简单上云第一步!华为云Flexus应用服务器L实例亮相华为云618营销季

YG科技

【中英互译】可以为你出谋划策的AI翻译

AppBuilder

活动回顾丨飞天技术沙龙 Serverless + AI 专场(上海站)回顾 & PPT 下载

阿里巴巴云原生

阿里云 Serverless 云原生

Postman变量使用指南

霍格沃兹测试开发学社

枚举并发集合探讨_.NET_Jonathan Allen_InfoQ精选文章