• D语言中的全局变量与多线程单例


            在D语言中的全局变量与其它语言有着一定的区别,D语言中的全部变量是分配在每一个线程中的,也就是说两个不同的线程访问到的全局变量是两个不同的数据。这是一个很神奇的事情,来看一个例子:

    import std.stdio;
    import core.thread;
    import std.concurrency;
    int temp = 0;
    int main(string[] argv)
    {
        spawn((){
            Thread.sleep(1.seconds);
    
            temp = 2;
            while(true)
            {
                writeln("in sub  thread : temp = ",temp,", temp address is ",&temp);
                Thread.sleep(1.seconds);
            }
        });
    
        temp = 1;
        while(true)
        {
            writeln("in main thread : temp = ",temp,", temp address is ",&temp);
            Thread.sleep(1.seconds);
        }
    }

    来看看运行结果是什么样子:

         image     运行的结果上可以看出:

         1. 两个线程中对temp没有内容覆盖问题

         2. 两个线程temp变量的地址不同

        也就是说这一个全部量变temp在不同的线程中却是不同的变量,这会有一个问题,那就是单例, 在其它程序中使用单例我们一个这么写:

    class TestClass
    {
        public static TestClass _Ins;    
        public static auto Ins()
        {
            if(_Ins is null)
                _Ins = new TestClass();
            return _Ins;
        }
    }

          在D语言中,这个么也能运行,没有错误,但是结果却不是我们想要的,这是因为以上原因,这个单例会在每一个线程中创建一个,那就已经不是单例了,呵呵。应该叫做单线程单例。

          需要真正的使用多线程单例,我们需要使用__gshared关键字。如下:

    class TestClass
    {
        public __gshared static TestClass _Ins;    
        public static auto Ins()
        {
            if(_Ins is null)
                _Ins = new TestClass();
            return _Ins;
        }
    }
  • 相关阅读:
    启动Kafka
    利用Flume将本地文件数据中收集到HDFS
    集群安装hbase
    安装并配置hive
    python文件引用其他文件中的变量
    模拟用户登录爬取淘宝数据
    信息领域热词分析系统--详细设计说明书
    信息领域热词分析系统--词云
    《TCP/IP详解卷1:协议》——第4章 ARP:地址解析协议(转载)
    深入理解计算机系统——第12章:多线程中共享变量
  • 原文地址:https://www.cnblogs.com/wanhongnan/p/5795500.html
Copyright © 2020-2023  润新知