从多个线程中读取全局值

时间:2017-07-17 10:41:15

标签: multithreading d

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);
}

1 个答案:

答案 0 :(得分:3)

默认情况下,D中的变量是线程局部的。使用shared__gshared