热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

d共享左值

原文sharedTT[]a;TprocessArray(T)(refT[]p){**}函数在参数上调用.保留.意思是void为函数返回类型a.processArray

原文

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义来去掉它.)


推荐阅读
  • Java基础——泛型与集合
    第八章泛型与集合第一节泛型定义:泛型是JavaSE1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这 ... [详细]
  • 锁优化有3个方向:1.减少持有锁的时间:例如,将CPU密集和IO密集的任务移到锁外,可以有效减少持有锁的时间, ... [详细]
  • 容器和类型推演scala为Java的泛型容器提供类型推演和类型安全型。在scala中,import语句中的下划线,等价于Java里的星号(*)。如果下划线不是跟在包名后, ... [详细]
  • 多线程-同步锁相关文章----synchronized原理(锁关键字)----ReentrantLock实现原理(可重入锁) ... [详细]
  • (张翰)PoW浴火重生,初链抗ASIC的挖矿原理
    2018-09-07火星公开课第167期|初链张翰:PoW浴火重生?从根本上抗ASIC做起|文章来源:火星财经(微信:hxcj24h)PoW真的应该被历史淘汰了么?要点速览:在不同 ... [详细]
  • 用phpStudy搭建DVWA漏洞测试环境详细过程
    目录结构1.下载、安装PhpStudy2.下载、存放DVWA3.配置DVWA环境4.访问DVWA进行登录DVWA简介前面几篇文章对渗透测试和安全测试的一些概念和执行流程有个大致了解 ... [详细]
  • 也就是|文传_密码学基础知识
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了密码学基础知识相关的知识,希望对你有一定的参考价值。密码学基础知识对称加密算法&# ... [详细]
  • 开发笔记:AWS 聘用 Rust 编译器联合创始人,大企为何都爱 Rust?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了AWS聘用Rust编译器联合创始人,大企为何都爱Rust?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • b+树的原理
    Java内存区域Heap线程公有存放实例对象是GC主要管理区域,因此可以更细致的划分为:新生代、老年代再细致一点划分:Eden区、FromSurvivo ... [详细]
  • 怎么样设置网站访问权限
    限制用户的网站访问权限往往可以有效的保护到自己的网站。方法步骤1在资源管理器右击“C:\inetpub”中的“www.—-com。”目录。2在快捷菜单中选择【属性】菜单项,咋ID卡 ... [详细]
  • 查找注解处理方法_Shiro权限注解与Aop冲突问题探究
    查找注解处理方法_Shiro权限注解与Aop冲突问题探究 ... [详细]
  • 优雅地关闭kubernetes中的nginx
    为什么80%的码农都做不了架构师?##SIGINTSIGTERMSIGKILL区别三者都是结束终止进程运行。###1.SIGINTSIGTERM区别前者与字符c ... [详细]
  • 9.4.2.2F#中的向上转换和向下转换(UPCASTSANDDOWNCASTS)如果类型之间的转换不会失败,就称为向上转换(upcast)。我们已经看到,把类型转换成由该类型实 ... [详细]
  • 原始文件:Linux IP Alias mini HOWTO翻译日期:19971023翻译维护:cwhuang@phys.ntu.edu.tw------------------- ... [详细]
  • 一.对象的创建1.类加载检查普通对象的创建过程:虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加 ... [详细]
author-avatar
晋coder
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有