2017-07-17 111 views
1

C++程序员在这里学习D. 这是一个非常简化的例子,用于演示我在真实代码中遇到的问题。我完全了解全局变量的代码风格问题,我只是想明白为什么这不起作用。从多个线程读取全局值

我有一个“全局”变量,我在创建任何线程之前在主程序中进行初始化。然后我有一些线程读取该变量。它被设置为从未,因此在它被设置之后应该没有竞争条件读取它而没有同步。

但它不起作用。我从来没有看到我的线程中的值12,他们总是读取值0. 我知道在C++中,您应该使用互斥锁或std :: atomic变量来确保写入一个线程的值在另一个线程中可见,并且在D中可能也是如此,但是我会认为对派生的调用几乎是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); 
} 

回答

3

中的变量d是线程局部的默认。请使用shared__gshared

+0

啊对了,当然,我知道这一点,在这方面没有想到。我猜想C++和D的风险是相似的。谢谢。 – jcoder