0
点赞
收藏
分享

微信扫一扫

d共享左值


​​原文​​

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


举报

相关推荐

0 条评论