10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

枚举并发集合探讨

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

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

关注

评论

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

CST的UAV无人机RCS:双站, TLM求解器,各向异性Thin Panel,碳纤维复合材料CFRP,

思茂信息

无人机 CST Studio Suite TLM求解器 PEC

拥抱AI变革,点燃算网引擎:2025开放数据中心大会定档

科技热闻

MD文档转换工具Deckset for Mac

晨光熹微

AeroSpace - macOS上的i3风格平铺窗口管理器

qife122

macos swift

软件工程3.0时代,为什么人工测试仍必不可少?

禅道项目管理

人工智能 AI 自动化测试

Airmail 5 for Mac 轻量级邮件客户端

晨光熹微

万界星空科技铜线/漆包线行业智能化MES系统解决方案

万界星空科技

mes 漆包线mes 铜线mes 漆包线 漆包线工厂

零碳园区:绿色发展新引擎,MyEMS 助力启航

开源能源管理系统

开源 能源管理系统 国能国标

采购那些事儿,如何把握性价比采购逻辑?

积木链小链

数字化转型 智能制造 采购管理

【HarmonyOS 5】鸿蒙App,Application,Ability以及页面和组件生命周期函数

GeorgeGcs

三角洲护航代练系统架构设计,基于WebSocket的实时护航通信系统实现

DUOKE七七

vue.js uniapp thinkphp6

Package Builder Mac安装包pkg制作工具

晨光熹微

快手 AutoThink 大模型 KAT-V1 正式开源,40B版本比肩满血版R1,技术报告全公开!

快手技术

开源 大模型

LazyLLM教程 | 第1讲:RAG原理解读:让检索增强生成不再是黑盒

商汤万象开发者

AI 教程 agent LLM

二次开发必看!DolphinScheduler 3.1.9 开发环境搭建指南

白鲸开源

大数据 开源 大数据任务调度 Apache DolphinScheduler 二次开发

DataSpell 2025 for Mac 专业数据科学家的IDE

晨光熹微

CORE漏洞赏金计划:携手社区共筑安全防线

qife122

智能合约 区块链安全

首发!百度百科全系能力上线千帆,权威知识增强Agent一键打造

百度Geek说

PhotoSweeper X for Mac 重复照片清理工具

晨光熹微

线上观看人次近 2 万,龙蜥社区走进中兴通讯 MeetUp 圆满结束

OpenAnolis小助手

开源 AI 操作系统 龙蜥社区 龙蜥meetup

龙蜥邀您参加 2025 开放原子开源生态大会

OpenAnolis小助手

操作系统 龙蜥社区 开放原子开源生态大会

Dropzone 4 for Mac 文件快捷拖放管理工具

晨光熹微

性能优化:两条SQL索引优化,CPU占用率从40%降至25%

电子尖叫食人鱼

数据库 sql

(在线CAD插件)WEB CAD二开形位公差标注

WEB CAD SDK

网页CAD 在线CAD

图谱不是玄学:时序数据库 TDengine 一步接入 Ontop,让时序数据更聪明

TDengine

tdengine 时序数据库 时序数据库tdengine

FlagRelease上线:自动迁移发布大模型多芯高效版本,用户下载即用

智源研究院

开源 大模型

Manus“跑路”风波背后,AI Agent的商业化困局

脑极体

AI

RustRover 2025 for Mac 高效Rust开发工具

晨光熹微

AI、大模型如何重塑海外舆情监测行业

沃观Wovision

人工智能、 海外舆情监控 AI 大模型 沃观Wovision 舆情监测系统

RISC-V基金会Datacenter SIG月会圆满举办,探讨RAS、PMU性能分析实践和经验

OpenAnolis小助手

操作系统 risc-v 龙蜥社区 Datacenter SIG 龙蜥 RISC-V SIG

2025 年非关系型数据库全面指南:类型、优势

镜舟科技

sql 数据分析 数据存储 非关系型数据库 StarRocks

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