C# 多线程锁2个线程没有';我什么也没表现出来
我刚刚学习了多线程,现在正在尝试锁定功能,我在代码中尝试的是每隔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
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:)