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

时间:2012-02-23 18:28:39

标签: c# multithreading global

我尝试过使用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";
    }
}

3 个答案:

答案 0 :(得分:4)

主线程(执行Console.WriteLine(q)的线程)正在运行该行,并在您启动的新线程之前退出,并有机会设置变量的值。

对线程同步做一些研究。

答案 1 :(得分:1)

试试这个(注意这是你的大脑掌握你的代码不起作用的原因。这不是建议使用模式 - 感谢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时,更好的方法是锁定变量。在这个例子中,一个简单的锁就可以了。只需在设置时和检索到写入控制台时锁定变量。

答案 2 :(得分:-1)

您没有阻止执行以等待新线程执行。如果你只是想让它写出来,你可以使用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和同步对象/模式进行一些研究。