当前位置:网站首页>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义来去掉它.)

原网站

版权声明
本文为[fqbqrr]所创,转载请带上原文链接,感谢
https://fqbqrr.blog.csdn.net/article/details/126280162