C# 多线程读写小实例 输出判断异常 求帮忙 新人
C# 多线程读写小实例 输出判断错误 求帮忙 新人
下面功能主要是对属性OnPingCount的读写操作,一线程读,一线程写,可是在ShowValue()里本应是对的,怎么又输出来了,求帮忙是哪边出了问题,感激不尽啊!!!!
------解决思路----------------------
又可能是这样的:
当值为35767的时候,进行判断OnPingCount !=35766,返回为true,
然后进行下个表达式判断的时候,值被其他线程修改为35766,进行判断OnPingCount !=35767,返回true,
so 输出 35766,当然,可能在这时又被修改。。。
------解决思路----------------------
你可以骗自己,但是你骗不了编译器
你必须明确的告诉编译器,哪个过程和哪个过程不能2个线程同时执行,必须等待
sp1234对锁头的比喻其实我觉得不是很恰当
应该这样说:如果房间没有门的话(只有门框),那么所有人都可以随时进出
我需要同一时间只能有一个人在里面,那么就要有个门,而且要上锁,先进去的把门锁住,后面的人就只能排队了
而你是保留了一个敞开的大门的同时,在旁边的墙上又开了个小门,然后在小门上上了锁,你以为自己进去,然后把门锁上,别人就进不来了吗?
下面功能主要是对属性OnPingCount的读写操作,一线程读,一线程写,可是在ShowValue()里本应是对的,怎么又输出来了,求帮忙是哪边出了问题,感激不尽啊!!!!
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public Int32 mu32OnPingCount = 35767;
public bool mbRun = true;
public Int32 OnPingCount
{
get { return mu32OnPingCount; }
set { Interlocked.Exchange(ref mu32OnPingCount, value); }
}
//读
public void ShowValue()
{
while (mbRun)
{
if (OnPingCount !=35766 && OnPingCount!=35767)
{
Console.WriteLine(OnPingCount);
}
}
}
public void Ping2()
{
while (mbRun)
{
OnPingCount =35766;
}
}
public void Ping35767()
{
while (mbRun)
{
OnPingCount = 35767;
}
}
public void Form1_Load(object sender, EventArgs e)
{
run();
}
public void run()
{
//创建新线程
ThreadStart WTStart = new ThreadStart(Ping35767);
Thread WriteThread = new Thread(WTStart);
//创建新线程2
ThreadStart WTStart2 = new ThreadStart(Ping2);
Thread WriteThread2 = new Thread(WTStart2);
WriteThread.Start();
WriteThread2.Start();
ShowValue();
}
}
------解决思路----------------------
又可能是这样的:
当值为35767的时候,进行判断OnPingCount !=35766,返回为true,
然后进行下个表达式判断的时候,值被其他线程修改为35766,进行判断OnPingCount !=35767,返回true,
so 输出 35766,当然,可能在这时又被修改。。。
------解决思路----------------------
你可以骗自己,但是你骗不了编译器
你必须明确的告诉编译器,哪个过程和哪个过程不能2个线程同时执行,必须等待
sp1234对锁头的比喻其实我觉得不是很恰当
应该这样说:如果房间没有门的话(只有门框),那么所有人都可以随时进出
我需要同一时间只能有一个人在里面,那么就要有个门,而且要上锁,先进去的把门锁住,后面的人就只能排队了
而你是保留了一个敞开的大门的同时,在旁边的墙上又开了个小门,然后在小门上上了锁,你以为自己进去,然后把门锁上,别人就进不来了吗?