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);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现