大咖直播-鸿蒙原生开发与智能提效实战!>>> 了解详情
写点什么

枚举并发集合探讨

  • 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:041228
用户头像

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

关注

评论

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

驱动力读书笔记之二

张老蔫

28天写作

Elastic开源协议修改限制用户,星环科技自研New Search青出于蓝

星环科技

给予你关注产品的利益相关者,想想他们的问题,自己设定一些前提,做个简单的排序。

戎帅

利益相关者的问题

沈弋

产品训练营 第三周作业

万顷湖天碧

产品训练营

今日姑苏佳景,俨然数字园林

脑极体

集群迁移自由来啦!4步将Rancher迁移至任意K8S发行版

Rancher

产品经理第三周作业

朱琴

作业:游戏的利益相关者

嫉妒的耗子

作业 - 第二章 产品思维和产品意识 (二)

hao hao

入网指南:一文读懂你身边的网络

第三周作业-相关方分析

Au revoir

产品训练营·第三周作业

产品经理训练营

产品经理训练营 Week3 作业

Mai

🍉 别再恐惧 IP 协议(万字长文 | 多图预警)

飞天小牛肉

面试 计算机网络 IP TCP/IP 2月春节不断更

一带一路上的中国品牌!AWS 助力中国新能源车企走向世界!

亚马逊云科技 (Amazon Web Services)

站出来打造真正开源的 Elasticsearch

亚马逊云科技 (Amazon Web Services)

产品训练营第三周作业-利益相关者关注的问题

jpcr987i

产品经理训练营第三周作业 - 利益相关方(二)

Denny-xi

产品经理 产品经理训练营

架构师训练营第五周作业 - 学习总结

阿德儿

产品手记--2

曦语

K8S原生存储持续进化,Longhorn 1.1迎来ARM支持

Rancher

第三周作业

Geek_72d5ab

5G专网是个大西瓜(一):价值之问

脑极体

大数据两万年

大伟

大数据 GFS

产品经理训练营 - 第三次作业

Jophie

产品经理训练营

速成算法笔记,Github上已收获近60K+star!力压LeetCode只为面试

程序员 面试 算法

《期权合同》常见的一个大坑,99%中招 | 视频号28天(26)

赵新龙

28天写作

学计算机的都是傻子?《打工人的点点思考》

谙忆

话题讨论 | 工作之外的时间怎样分配

程序员架构进阶

时间分配 自我提升 话题讨论 2月春节不断更

极客时间产品经理训练营第 3 次作业

待注册

极客大学产品经理训练营

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