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语言的synchronizedshared是独立的.
如果必须发送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包含元素前,它就是个nullAA.添加第一个元素时,分配它.复制nullAA时,它不会影响原AA.
可通过重新转换AA而不是复制它来解决此问题:

auto r = .require(*(cast(T*)&table), key);
// 如下同样:
auto r = (cast()table).require(key);
posted @   zjh6  阅读(13)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示