0
点赞
收藏
分享

微信扫一扫

d同步共享关联数据.要求错误


原文

synchronized class SyncTable(KEY, VAL) {
private VAL[KEY] table;
auto require(KEY key) {
return table.require(key);
}
}

auto table = new shared SyncTable!(string, string);
table.require("abc");

​放弃共享​​​更不好.
错误:​​​!()(shared(string[string]), string)​​​类型没有​​object.require​​重载.

当前版本D语言的​​synchronized​​​和​​shared​​​是独立的.
如果必须发送​​​synchronized​​​类的​​引用​​​到不同线程,那么可安全转换​​shared​​,然后稍后删除它:

synchronized class A{
...
}

void sendTo(Tid to, A a){
to.send(cast(shared A) a);
}

A receiveA(){
A a;
receive( (shared A sa) { a = cast(A) sa; });
return a;
}

​同步​​​的​​类成员函数​​​会自动成为​​共享​​的.

你返回的是​​非共享值​​​,但​​类​​​是​​共享​​​的,表明​​table​​​内部都是​​共享​​​的,如果丢弃​​共享​​​,则返回时,必须加上.
这里没有​​​TLS​​.

这样呢:

alias VAL[KEY] T;
auto require(KEY key) {
auto unsharedT = cast(T) table;
auto r = unsharedT.require(key);
table = cast(shared) unsharedT;
return cast(shared) r;
}

改变​​unsharedT​​​,而​​table​​​未变,但需要​​重赋值​​,很奇怪.

这很好,但仍不必有共享​​KEY​​​.但这真的取决于​​KEY​​​是什么.很可能没问题(例如,如果​​KEY​​​是串).如果不从​​键​​​中取值,而只是用来​​映射​​到值,我认为应该没问题

是的,因为在​​AA​​​包含​​元素​​​前,它就是个​​null​​​AA.添加第一个元素时,分配它.复制​​null​​​AA时,它不会影响原AA.
可通过重新转换​​​AA​​​而不是​​复制​​​它来解决​​此问题​​:

auto r = .require(*(cast(T*)&table), key);
// 如下同样:
auto r = (cast()table).require(key);


举报

相关推荐

0 条评论