黑马程序员技术交流社区

标题: 多线程方法重入问题。 [打印本页]

作者: shenge321    时间: 2013-5-20 15:48
标题: 多线程方法重入问题。
本帖最后由 shenge321 于 2013-5-21 13:05 编辑

方法重入是将两个线程独立执行同一个方法。但是打印的效果总是有那么一些些偏差。有人能详细解释一下吗?
同一个代码出现两种结果。
结果2

结果2
  1. public Form1()
  2.         {
  3.             InitializeComponent();
  4.             Label.CheckForIllegalCrossThreadCalls = false;
  5.         }

  6.         void changetext()
  7.         {
  8. <blockquote>            //注释的为以前出错的代码。
复制代码

作者: 李国龙    时间: 2013-5-20 16:50
这个我也试过了,我觉得应该是两次电脑的cup使用率的不同吧。因为我看了那个基础教学的视频里面这个程序反应要好一会可是我的电脑几秒就好了,所以我觉得这个跟电脑当时的使用有关,内存了,cup了。这是我个人的理解希望对你有帮助!
作者: 向德伟    时间: 2013-5-20 18:26
楼主我也是刚看的这个视频.

多线程重入是在线程1刚调用到这个方法时,线程2马上就开始调用这个方法了.这个时候,线程1的方法里面的代码还没执行完,所以出现了这种数据有差异的情况.

你看我说的对吗?楼主加油!
作者: shenge321    时间: 2013-5-20 19:12
向德伟 发表于 2013-5-20 18:26
楼主我也是刚看的这个视频.

多线程重入是在线程1刚调用到这个方法时,线程2马上就开始调用这个方法了.这个 ...

苏坤老师最后说,多个线程独立执行方法(各线程将方法拷贝一份执行),并不是共同使用方法。与视频前面说的有些不合。所以我很混乱,不知道多线程方法重入到底指的是什么。也无法分析上面到底是哪里出了问题。
作者: 盘晟    时间: 2013-5-21 11:36

出错原因两个进程同时计算这个方法,不相干扰应该每个线程计算的结果都是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决定的,时间相差不大,但会有不可预计的计算错乱


作者: shenge321    时间: 2013-5-21 13:03
盘晟 发表于 2013-5-21 11:36
出错原因:两个进程同时计算这个方法,不相干扰应该每个线程计算的结果都是500的,但是这里的结果输出却 ...

谢谢。总算明白了。
作者: 狐狸FMF    时间: 2014-8-15 09:18
e     有点深奥的样子
作者: wujiemin    时间: 2014-10-7 23:23
有点深奥的样子




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2