从多个线程读取全局值
Reading global value from multiple threads
C++程序员在这里学习D。
这是一个非常简化的示例,用于演示我在实际代码中遇到的问题。我完全了解全局变量的代码风格问题,我只是想了解为什么这不起作用。
我有一个 "global" 变量,我在创建任何线程之前在主程序中对其进行了初始化。然后我有一些线程读取该变量。它在设置后 never 写入,因此在设置后不同步读取它应该没有竞争条件。
但是没用。我从来没有在我的线程中看到值 12,它们总是读取值 0。
我知道在 C++ 中,您应该使用互斥锁或 std::atomic 变量来确保写入一个线程的值在另一个线程中可见,并且在 D 中可能也是如此,但是我会假设调用spawn 几乎 100% 可能已经做了同步的事情加上我尝试了一个互斥锁,即使我试图用一个互斥锁保护该值,我仍然在主线程中看到 12,在衍生线程中看到 0。
我需要做些什么才能完成这项工作吗?
无论我做什么我都会得到:-
From thread A=0
From main A=12
密码是:-
import std.concurrency;
import std.stdio;
import core.thread;
int a;
void myThread()
{
writeln("From thread A=", a);
}
void main()
{
a = 12;
spawn(&myThread);
Thread.sleep(2.seconds);
writeln("From main A=", a);
}
默认情况下,D 中的变量是线程本地的。使用 shared
或 __gshared
.
C++程序员在这里学习D。 这是一个非常简化的示例,用于演示我在实际代码中遇到的问题。我完全了解全局变量的代码风格问题,我只是想了解为什么这不起作用。
我有一个 "global" 变量,我在创建任何线程之前在主程序中对其进行了初始化。然后我有一些线程读取该变量。它在设置后 never 写入,因此在设置后不同步读取它应该没有竞争条件。
但是没用。我从来没有在我的线程中看到值 12,它们总是读取值 0。 我知道在 C++ 中,您应该使用互斥锁或 std::atomic 变量来确保写入一个线程的值在另一个线程中可见,并且在 D 中可能也是如此,但是我会假设调用spawn 几乎 100% 可能已经做了同步的事情加上我尝试了一个互斥锁,即使我试图用一个互斥锁保护该值,我仍然在主线程中看到 12,在衍生线程中看到 0。
我需要做些什么才能完成这项工作吗?
无论我做什么我都会得到:-
From thread A=0
From main A=12
密码是:-
import std.concurrency;
import std.stdio;
import core.thread;
int a;
void myThread()
{
writeln("From thread A=", a);
}
void main()
{
a = 12;
spawn(&myThread);
Thread.sleep(2.seconds);
writeln("From main A=", a);
}
默认情况下,D 中的变量是线程本地的。使用 shared
或 __gshared
.