2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

C#中安全并行机制的唯一性和引用不可变性研究

  • 2012-12-20
  • 本文字数:1141 字

    阅读完需:约 4 分钟

近来,微软、微软研究院和华盛顿大学的不少知名人士正在对 C#中的新变量类型进行研究。该变量类型引入了语言级别上的可读性和不可变引用(immutable references)的概念。这意味着每种引用有四种权限的限定符,这些限定符会修改变量和参数。

C#中的普通引用是“可写(writable)”权限。这表示引用所指向的对象可以用普通的方法和属性设置进行修改。

下一种限定符是“可读(readable)”权限。可读引用是对象的一种只读视图。在这种权限下你还是可以修改对象,只是不能用特殊的引用方式进行修改。

如果任何一种引用都无法修改某对象,那么这种引用就称作为“不可变(immutable)”。不可变引用也被称作只读引用,不可变引用所指向的所有对象都是不可变的。

最后一种权限限定符叫做“隔离(isolated)”,表示“对外部唯一对象簇的外部引用”。这是个相对复杂的概念。想象一下,在某个图表中你有一些可变对象,你能够通过简单或复杂方法引用,但是你不能在图表之外直接引用这些对象。除非这个对象是根聚集,这是一种例外。研究中的图 1 也许能更清楚地表示这种限定符:

很多研究集中探讨了对象如何在这四种限定符之间进行转换。这个概念在创建复杂、不可变的对象图表中至关重要。在传统的功能性编程语言当中,程序自下而上地创建不可变对象图表。由于对开发语言的依赖,这使得内部循环变得困难甚至不可行。这还可能造成性能下降,特别是当开发过程中的叶节点需要进行修改时。

而在新模式下,对象图表首先从可变对象中创建,正如传统的面向对象编程风格的图表。被标记成“隔离”的单个变量去引用根图表。之后你可以用函数将变量所对应的值从“隔离”T 转换成“不可变”T,以达到“恢复不可变性”的作用。(谨记,“隔离”和“不可变”是变量类型的限定符,而非它们所引用的对象类型。)

这样做的主要原因在于,这让我们可以使用更安全的并行机制。编译器能够通过权限的限定符来判断程序是否安全地访问对象,并且不会引入竞争条件。尽管这样做无法彻底地消除死锁,但至少能够减少死锁的频率。

这种设计还开启了优化编译器及执行环境的新途径。

比如对不可变数据,并发的垃圾回收可以使用更灵活的可读边界。编译器变得更支持 Code Motion 以及缓存,并支持通过 MSIL-to-native 传递将不可变数据保留为二进制方式。

Colin S. Gordon、Matthew J. Parkinson、Jared Parsons、Aleks Bromfield 和 Joe Duffy 共同撰写了《安全的并行机制的唯一性和不可变性引用》。

查看英文原文: Research into Uniqueness and Reference Immutability for Safe Parallelism in C#


感谢侯伯薇对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2012-12-20 04:322381

评论

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

书单 | 读了这10本书,再也不怕黑客攻击了

博文视点Broadview

CANN AICPU算子耗时分析及优化探索

华为云开发者联盟

tensorflow 测试 算子 CANN算子 算子耗时

架构实战营第一期 -- 模块八作业

clay

架构实战营

数据通信网络基础

Regan Yue

华为数据通信 9月日更 数据通信

你真的了解Redis单线程为什么如此之快吗?

Linux服务器开发

数据库 redis 多线程 Linux服务器开发 单线程

【WIC•资讯】世界智能大会组委会秘书处祝贺 2021中国(天津)非公有制经济发展论坛圆满召开

InfoQ 天津

Growing 账号认证实践

GrowingIO技术专栏

spring security CAS SSO ldap

第1章-《Linux一学就会》-Linux课程介绍-学习环境搭建

学神来啦

Linux 运维 contos

【通知】2021年“绿城杯”网络安全大赛开始报名啦!

郑州埃文科技

C++20 Concepts 极简介绍

董一凡

c++

k8s 驱逐pod疑惑

Geek_f24c45

Kubernetes kubelet

LDAP是什么意思?有什么用?

行云管家

运维 服务器 AD域 目录

【等保三级】过等保三级需要哪些设备?大概多少钱?

行云管家

网络安全 信息安全 等保 堡垒机 等保三级

Phaser类在性能测试中应用

FunTester

多线程 性能测试 测试框架 FunTester phaser

字节4轮面试,拿43k*15 Offer!全靠过硬实力+1290题面试神技手册

Java 架构 面试 后端 计算机

区块链技术,让数字政务跑出“加速度”

CECBC

极客时间企业版|数字化转型专题讲座天津站圆满结束

InfoQ 天津

聊聊汽车ECU中单片机开发

SOA开发者

车载控制单元

滨海新区新的社会阶层人士开展“寻美.天津”主题活动

InfoQ 天津

隐私计算﹢区块链:让数据真正成为生产要素

CECBC

智能汽车安全保障亟待加强,熵核科技助力“人车互联”

熵核科技

系统安全 自动驾驶安全

Opus从入门到精通(三)手撸一个Opus编码程序

轻口味

音视频 9月日更 Andriod

Pulsar 用户案例|消息队列上云挑战与方案:腾讯云的 Apache Pulsar 实践

Apache Pulsar

Apache Pulsar

一文搞懂如何使用Node.js进行TCP网络通信

华为云开发者联盟

node.js TCP 网络 网络通信 TCP服务器

30天读完300页,这份Alibaba面试通关手册,助我“闯进”字节跳动拿下offer

Java spring 编程 架构

足以封神的SpringCloudAlibaba问世,看过的人都已经“登仙”了

Java 程序员 面试 springboot 计算机

区块链 ≠ 分布式存储

趣链科技

区块链 分布式 存储

人民币突传大好消息,首款数字货币“官宣”了!

CECBC

一周信创舆情观察(9.6~9.12)

统小信uos

得偿所愿!字节4面斩下2-2Offer,入职就是30K16薪,相信你们也可以!

Java 程序员 字节跳动 面试 计算机

基于MySQL binlog日志,实现Elasticsearch近实时同步实践

Java MySQL 编程 架构 计算机

C#中安全并行机制的唯一性和引用不可变性研究_C#_Jonathan Allen_InfoQ精选文章