【D言語】データ共有
2189 ワード
D言語では、グローバル変数と静的変数のデフォルトはTLSに格納されます.これは、異なるスレッドが異なる変数のコピーを持っていることを意味します.これは、他の言語とは異なります.
しゅつりょく
Main Thread: x=5 Main Thread: y=5 Child Thread: x=3 Child Thread: y=3
メインスレッドは変数値を変更したが、サブスレッド出力は初期値であり、グローバル変数と静的変数がTLSにデフォルトで格納されていることを証明した.
一、マルチスレッド共有変数
マルチスレッドでグローバル変数、静的変数を使用する必要がある場合は、キーワードsharedを使用する必要があります.
出力結果:
Main Thread: x=5 Main Thread: y=5 Child Thread: x=5 Child Thread: y=5
変数値が同じであるため,プライマリスレッドとサブスレッドが1つのコピーを共有することを実証した.
sharedキーワードは、データをグローバルに格納するだけでなく、変数タイプも変更します.
上のコードをコンパイルするとエラーが発生します:Error:function main.foo(shared(int[]) x) is not callable using argument types (int[])
正しいタイプは、shared int[]です.
二、暴力共有
暴力共有とはC/C++の元のグローバル変数に戻ることですが、安全ではありません.例えば、安全関数では使用できません.
このようにコンパイルできないと、エラーが発生します: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
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