全局变量未在新线程中初始化
本文关键字:线程 初始化 新线程 全局变量 | 更新日期: 2023-09-27 18:25:31
我尝试过使用volatile。。。。
q是一个全局类变量,该类中的任何成员都可以访问它。我必须创建一个线程t;在A级?
class A
{
string q;
public void SomeMethod ()
{
new Thread(Method ()).Start();
Console.WriteLine (q); //this writes out nothing
}
private void Method ()
{
q = "Hello World";
}
}
执行Console.WriteLine(q)
的主线程正在运行该行,并在您启动的新线程有机会设置变量值之前退出。
对线程同步进行一些研究。
试试这个(注意,这是为了让你的大脑掌握代码不工作的原因。这不是一个使用模式的建议-感谢Chris的评论):
class A
{
string q;
public void SomeMethod ()
{
new Thread(Method ()).Start();
//Add this so the thread finishes (not a good permanent solution)
Thread.Sleep(500);
Console.WriteLine (q); //this writes out nothing
}
private void Method ()
{
q = "Hello World";
}
}
为什么这会奏效?因为它让第一个线程有机会在您向控制台写入之前完成它的工作。这意味着一个线程在写,而另一个线程正在设置。
现在,更好的方法是在更改/检索q时锁定变量。在本例中,简单的锁定就可以了。只需在设置和检索时锁定变量即可写入控制台。
您并不是为了等待新线程执行而阻止执行。如果你只是想让它写出一些东西,你可以使用waitHandle或一个非常简单的布尔标志,比如
class A
{
string q;
bool hasBeenSet;
public void SomeMethod ()
{
new Thread(Method ()).Start();
while(!hasBeenSet)
{
Thread.Sleep(10);
}
Console.WriteLine (q); //this writes out nothing
}
private void Method ()
{
q = "Hello World";
hasBeenSet = true;
}
}
尽管如此,您确实应该对WaitHandles和同步对象/模式进行一些研究。