出错原因:两个进程同时计算这个方法,不相干扰应该每个线程计算的结果都是500的,但是这里的结果输出却让人以外,原因是第一个两个线程同时计算,并不是同时开始计算,而是根据cpu决定的哪个先开始,哪个后开始,虽然相差时间不多,但后开始的就会取用先开始计算过的数据计算,这样就会导致计算错乱。
解决办法:解决这个的一个简单办法解释给方法加锁,加锁的意思就是第一个线程取用过这个资源完毕后,第二个线程再来取用此资源。形成排队效果。
下面给方法加锁。
//多线程要重入的方法,这里加锁。
void changetext()
{
lock(this)
{
lbtxt.Text = "0";
int lbnum = int.Parse(lbtxt.Text);
for (int i = 0; i < 500; i++)
{
Console.WriteLine(Thread.CurrentThread.Name + ",lbnum=" + lbnum);
lbtxt.Text = lbnum++.ToString();
}
}
}
给方法加过锁后,线程一前一后取用资源,就能避免不可预计的错乱结果,第一个线程计算为500,第二个线程计算就是从500开始,这里的结果就为1000。
--------------------------------------------------------------------------------
小结:多线程可以同时运行,提高了cpu的效率,这里的同时并不是同时开始,同时结束,他们的开始是由cpu决定的,时间相差不大,但会有不可预计的计算错乱。
|