• d共享左值


    原文

    shared TT[] a;
    T processArray(T)(ref T[] p){/*...*/} 
    //函数在参数上调用`.保留`.意思是`void`为函数`返回类型`
    a.processArray;
    //不能从`!()(shared(T[]))`推导.
    
    • 1
    • 2
    • 3
    • 4
    • 5

    即使更改函数为仅接受共享参数,.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义来去掉它.)

  • 相关阅读:
    Centos 安装 OpenLDAP
    基于PHP+MySQL高校教务选课系统的设计与实现
    vue安装electron事项
    【Java】集合 之 Java集合简介
    leetcode动态规划系列(求路径篇)
    Windows Server 2019 - 文件共享
    电流反馈型运放以及PCB
    C++(List的模拟实现)
    有 Docker 谁还在自己本地安装 Mysql
    SpringBoot+Vue项目电子招投标系统
  • 原文地址:https://blog.csdn.net/fqbqrr/article/details/126280162