d的同步类和共享

原文
根据官方文档处理shared变量时,只允许原子操作它们.但是由于只能一个线程访问synchronized类,因此即使在shared环境中,允许访问其成员也是合理的,编译器至少应允许如下小代码:

synchronized class A{
  private:
    int a;
  public:
    this() {
      a = 1;
    }

    int getA() pure{
      return a;
    }
}

int main(){
  shared A c = new A();
  writeln(c.getA());
  return 0;
}

为什么官方文档中未添加该功能?
不同线程可访问shared数据,想向另一线程发送指针时,即使是synchronized类,指针数据也必须是shared,如下:

import std.stdio;
import std.concurrency;

synchronized class A{
    //略,两个函数都加了个纯...
}

void thread(A a){
  writeln(a.getA());
}

int main(){
  auto c = new A();
  spawn(&thread, c);
  return 0;
}

不编译,要编译:

import std.stdio;
import std.concurrency;

synchronized class A{
    //略,两个函数都加了个纯...
}

void thread(shared A a){
  writeln(a.getA());
}

int main(){
  auto c = new shared A();//共享.
  spawn(&thread, c);
  return 0;
}

必须加共享.

这是正确的,但是sharedD并发中还有另一个含义.考虑到getA()会修改a,然后因为shared链接他们,编译器告诉你忘记它并改用原子操作.
原子操作是硬件指令,同步或多或少是软件实现的.非常不同的东西.所以D说用shared是准备比其他机制更线程安全的原子操作,并且只允许操作有此存储类的对象,如果正确使用它,可提供一些保证(这是我的理解).
由于同步需要互斥锁,失去了原子的优势和/或做错事,因此自动转换代码意义不大,否则它也可能错了.
是的,但是Phobos也应允许同步在线程间传递类,而不仅是shared数据.如果不使用低级函数或使用cast,同步类几乎没用.

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