C ++程序员在这里学习D. 这是一个非常简单的示例,用于演示我在实际代码中遇到的问题。我完全了解全局变量的代码样式问题,我只是想了解为什么这不起作用。
我有一个“全局”变量,我在创建任何线程之前在主程序中初始化。然后我有一些线程读取该变量。在设置之后从不写入,因此在设置之后不应该没有同步地读取它的竞争条件。
但它不起作用。我从未在线程中看到值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);
}
答案 0 :(得分:3)
默认情况下,D中的变量是线程局部的。使用shared
或__gshared
。