繁体   English   中英

C#线程共享数据

[英]C# Thread shared data

我需要你的帮助。 我只是开始学习线程主题。 为什么打印两次“ t2”?

        string text = "t1";
        Thread t1 = new Thread ( () => Console.WriteLine (text) ); 
        t1.Start();   // why do not print 't1'?
        text = "t2";
        Thread t2 = new Thread ( () => Console.WriteLine (text) );
        t2.Start();   // print 't2'

输出:

t2
t2

因为text是共享的。 线程t1可以启动(在后台),并且可以在线程t1可以打印任何内容之前将文本分配给t2。 因此,两者都打印t2。 如果事情发生得足够快,可能偶尔会先打印t1,然后再打印t2。

由于给出了一个简单的示例,因此我将给出一个简单的解决方案(尽管不太有用):

string text = "t1";
Thread t1 = new Thread(() => Console.WriteLine(text));
t1.Start();   // why do not print 't1'?
t1.Join(); // Wait for thread t1 to finish before continuing

text = "t2";
Thread t2 = new Thread(() => Console.WriteLine(text));
t2.Start();   // print 't2'

不同之处在于您在分配text新值之前等待线程t1完成执行。 我仅给出此示例,因为您可以使用Join来等待线程完成。

稍微复杂一点的方法是不使用Lamda表达式。 如果您创建一个静态函数来工作,则可以将单个参数(任何类型的object )传递给线程上的Start函数:

    public static void DoPrint(object data)
    {
        Console.WriteLine((String)data);
    }

    static void Main(string[] args)
    {
        string text = "t1";
        Thread t1 = new Thread(DoPrint);
        t1.Start(String.Copy(text)); // Pass a copy of text to Thread and start

        text = "t2"
        Thread t2 = new Thread(DoPrint);
        t2.Start(String.Copy(text)); // Pass a copy of text to Thread and start
    }

请注意,我们是如何在传递文本数据之前对其进行复制的。通过这种方式,即使在线程t1打印之前text = "t2"确实完成了,因为传递了副本也没关系。 如果两条开始行是:

        t1.Start(text);
        t2.Start(text);

那么出于相同的原因,我们将遇到与您的原始示例相同的问题。 文本是字符串,而字符串是类,因此它们通过引用传递。

因为在t1开始工作之前,将文本变量分配给“ t2”,然后2和t1开始同时工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM