【D言語】データ共有

2189 ワード

D言語では、グローバル変数と静的変数のデフォルトはTLSに格納されます.これは、異なるスレッドが異なる変数のコピーを持っていることを意味します.これは、他の言語とは異なります.
import std.stdio, core.thread;

auto x = 3; //          TLS,     C/C++

void main()
{
    static y = 3;  //            ,   TLS
    x = 5;
    y = 5;
    writeln("Main Thread: x=", x);
    writeln("Main Thread: y=", x);

    new Thread({ 
        writeln("Child Thread: x=", x); 
        writeln("Child Thread: y=", y);
    }).start();

    Thread.sleep(dur!("seconds")(2));
}

しゅつりょく
Main Thread: x=5 Main Thread: y=5 Child Thread: x=3 Child Thread: y=3
メインスレッドは変数値を変更したが、サブスレッド出力は初期値であり、グローバル変数と静的変数がTLSにデフォルトで格納されていることを証明した.
一、マルチスレッド共有変数
マルチスレッドでグローバル変数、静的変数を使用する必要がある場合は、キーワードsharedを使用する必要があります.
import std.stdio, core.thread;

shared x = 3;

void main()
{
    static shared y = 3;
    x = 5;
    y = 5;
    writeln("Main Thread: x=", x);
    writeln("Main Thread: y=", x);

    new Thread({ 
        writeln("Child Thread: x=", x); 
        writeln("Child Thread: y=", y);
    }).start();

    Thread.sleep(dur!("seconds")(2));
}

出力結果:
Main Thread: x=5 Main Thread: y=5 Child Thread: x=5 Child Thread: y=5
変数値が同じであるため,プライマリスレッドとサブスレッドが1つのコピーを共有することを実証した.
sharedキーワードは、データをグローバルに格納するだけでなく、変数タイプも変更します.
import std.stdio;

void foo(shared int[] x)
{
    writeln(x);
}

void main()
{
    int[] arr = [1,2,3];
    foo(arr);
}

上のコードをコンパイルするとエラーが発生します:Error:function main.foo(shared(int[]) x) is not callable using argument types (int[])
正しいタイプは、shared int[]です.
二、暴力共有
暴力共有とはC/C++の元のグローバル変数に戻ることですが、安全ではありません.例えば、安全関数では使用できません.
import std.stdio;

void foo(shared int[] x) @safe
{
    writeln(x);
}

void main()
{
    __gshared arr = [1,2,3];
    foo(arr);
}

このようにコンパイルできないと、エラーが発生します:Error:function main.foo(shared(int[]) x) is not callable using argument types (int[])
なぜ必要なの?C/C++と対話するときに役に立つかもしれないからです.
三、可変データがTLSにない
また,immutableで宣言された変数はTLSに格納されず,可変データ自体がスレッドセキュリティであるため,TLSには使用されない.
参照先:
https://dlang.org/articles/migrate-to-shared.html