全局变量未在新线程中初始化

本文关键字:线程 初始化 新线程 全局变量 | 更新日期: 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和同步对象/模式进行一些研究。