C# 多线程锁2个线程没有';我什么也没表现出来

C# 多线程锁2个线程没有';我什么也没表现出来,c#,multithreading,locking,C#,Multithreading,Locking,我刚刚学习了多线程,现在正在尝试锁定功能,我在代码中尝试的是每隔2秒显示myText,但在控制台中没有显示任何内容 class Program { string Text = ""; long Counter = 0; string Source = "abc def ghi"; static void Main(string[] args) { ThreadStart testThread1Start = new ThreadStart

我刚刚学习了多线程,现在正在尝试锁定功能,我在代码中尝试的是每隔2秒显示
myText
,但在控制台中没有显示任何内容

class Program
{
    string Text = "";
    long Counter = 0;
    string Source = "abc def ghi";

    static void Main(string[] args)
    {
        ThreadStart testThread1Start = new ThreadStart(new Program().WriteThread);
        ThreadStart testThread2Start = new ThreadStart(new Program().ReadThread);

        Thread[] testThread = new Thread[2];
        testThread[0] = new Thread(testThread1Start);
        testThread[1] = new Thread(testThread2Start);

        foreach (Thread myThread in testThread)
        {
            myThread.Start();
        }

        Console.ReadLine();
    }

    public void WriteThread()
    {
        while (true)
        {
            Thread.Sleep(1000);
            if (Source != null)
            {
                lock(this)
                {
                    Text = Source;
                    Counter = Counter + 1;
                }
            }
        }
    }

    public void ReadThread()
    {
        long myCounter = 0;
        string myText = "";
        while (true)
        {
            Thread.Sleep(1000);
            if (myCounter < Counter)
            {
                lock (this)
                {
                    myText = Text;
                    Console.WriteLine(myText);
                }
            }
        }
    }
}
类程序
{
字符串文本=”;
长计数器=0;
字符串Source=“abc def ghi”;
静态void Main(字符串[]参数)
{
ThreadStart testThread1Start=newthreadstart(new Program().WriteThread);
ThreadStart testThread2Start=newthreadstart(new Program().ReadThread);
线程[]testThread=新线程[2];
testThread[0]=新线程(testThread1Start);
testThread[1]=新线程(testThread2Start);
foreach(在testThread中读取线程)
{
myThread.Start();
}
Console.ReadLine();
}
public void WriteThread()
{
while(true)
{
睡眠(1000);
如果(源!=null)
{
锁(这个)
{
文本=来源;
计数器=计数器+1;
}
}
}
}
public void ReadThread()
{
长myCounter=0;
字符串myText=“”;
while(true)
{
睡眠(1000);
if(myCounter<计数器)
{
锁(这个)
{
myText=文本;
Console.WriteLine(myText);
}
}
}
}
}

ReadThread
中的计数器始终为0,这是为什么?它还是锁着还是怎么回事?

与线程无关。每次都要创建一个
程序的新实例,因此线程在自己的实例上运行
new Program()。WriteThread
new Program()。ReadThread
Rob已正确识别主要问题。但是,请注意,您还存在一个理论上的线程安全问题,即您在访问共享数据时没有同步;i、 e.
计数器
变量。在不将其标记为volatile的情况下,编译器可以自由地优化访问,从而防止一个线程看到更改。还有一个问题是
long
的宽度为64位,并且在x86上变量不会自动更新,因此尝试读取未同步的变量可能会导致看到部分更新的值。最后,您的
ReadThread()
从不更新
myCounter
@Rob哦,我明白了,所以我尝试为线程创建另一个类,并使线程保持静态。但是我怎么能把一个变量从WriteThread发送到ReadThread呢?@Mirza让一切都和你最初发布的一模一样。但是,在开始时,编写,
var program=new program()
,然后使用
new ThreadStart(program.WriteThread)
new ThreadStart(program.ReadThread)
。还要注意Peter带来的问题Hanks@Rob n@Peter Duniho:)