当前位置:网站首页>d共享左值
d共享左值
2022-08-11 11:27:00 【fqbqrr】
shared TT[] a;
T processArray(T)(ref T[] p){
/*...*/}
//函数在参数上调用`.保留`.意思是`void`为函数`返回类型`
a.processArray;
//不能从`!()(shared(T[]))`推导.
即使更改函数为仅接受共享参数,.reserve也不支持共享,因此如果不更改类型或使用__gshared,则无法使用该函数.
除了使用指针和强制(用processArray(*(cast(Unqual!TT*)&a))转换,不理想)之外,有没有更好的方法来不转换为右值的转换左值类型?(因为编译失败,直接强制转换似乎会创建右值.)
谢谢
.reserve无法正确支持shared,因为在整个程序中,它不知道如何正确同步切片及其内容.
一般,丢弃shared让编译器停止抱怨,完全违背shared的目的,与__gshared一样不安全.
相反,必须自己,如使用core.sync.mutex来同步.只有正确同步,才可丢弃shared.这是shared的目的,且与__gshared的唯一区别:转换时,记住要同步.
一般,应该同步整个shared代码保护区域,同步单个操作(就像单独同步.reserve)一般是错误的,或更确切地说,是不够的.
同步必须保证:当线程写入数据时,它具有独占访问权限.但是,只要此时不写入数据,多线程同时读取数据是安全且快速的.core.sync.rwmutex可以用来实现该优化.
(可用无锁算法(请见core.atomic)或其他更复杂的方案来设计支持多个同时写入算法,这很难,有时不必).
最后,如果只需要写入一次数据,之后只会读它,则可跳过所有这些混乱和复杂性,只需从非共享容器中的单线程准备数据,然后使用cast(immutable)(如果只有一个现存引用)或.idup(否则).不必同步immutable数据.*(cast(Unqual!TT*)&a),这是重新强制转换左值的正确方法(前提是生成类型与源类型兼容).
(因为编译失败,直接转换似乎创建了右值.)
是的,直接转换应该产生右值.(虽然,可用自定opCast义来去掉它.)
边栏推荐
- LeetCode69:牛顿迭代法和二分法求解x的平方根
- 【Study Notes】Unused graph theory knowledge
- SM5200原厂SOT23-6 500mA 线性锂电子替代芯片
- 兴盛优选:时序数据如何高效处理?
- Starting from zero configuration vim (11) -- plug-in management
- 【毕业设计】老人心率脉搏血压体征监测手表 - stm32 单片机 嵌入式 物联网
- 开源汇智创未来 | 软通动力出席开放原子全球开源峰会OpenAtom openEuler分论坛
- StratoVirt 中的虚拟网卡是如何实现的?
- 「开源推荐」一个通用的后台管理系统
- openresty概述及Lua语言的嵌入
猜你喜欢

巧用自定义函数,文本控件秒变高速缓存

宝塔计划任务执行周期设置【秒】为定时单位【或者更小】

CCF大会腾源会专场即将召开,聚焦基础软件与开发语言未来发展

Flutter 教程之 Kotlin 多平台与 Flutter,为您的应用选择哪一个

阿里云 Hologres助力好未来网校实时数仓降本增效

Summary of darknet structures

SM5200原厂SOT23-6 500mA 线性锂电子替代芯片

Configuring vim(12) from scratch - theme configuration

C语言手写魂斗罗(一)

开源汇智创未来 | 软通动力出席开放原子全球开源峰会OpenAtom openEuler分论坛
随机推荐
Small target stunt | Complete the small target detection upgrade of Yolov5 in the easiest way!
分布式时间槽elastic timeslot架构设计
爆赞!阿里P8首次分享出基于Docker的企业级Redis实战开源笔记
重要消息丨.NET Core 3.1 将于今年12月13日结束支持
【学习笔记】尚未用过的图论知识
chrome无痕浏览模式中使用插件
悠漓带你玩转C语言(详解操作符1)
七、一起学习Lua 函数
requestAnimationFrame的应用
MySQL --- storage engine
好的架构是进化来的,不是设计来的
openEuler小程序会议指南
HyperLynx(五)反射仿真
反射获取DLL中的字段、属性、方法、泛型方法(C#)
Getting Started with Chrome Plug-in Development - Nanny Level Raiders
巧用自定义函数,文本控件秒变高速缓存
centos linux 下安装mysql 8.0
亏了3000亿,巴菲特:这也叫亏?
I got the P8 "top" distributed architecture manual that went viral on Ali's intranet
【学习笔记】线性规划对偶定理