none
今天遇到一个很迷茫的问题,希望能得到解答,线程同步。 RRS feed

  • 问题

  •  static int c = 0;
    
            static void Main(string[] args)
            {
                for (int i = 0; i < 10000; i++)
                {
                    Thread t = new Thread(new ThreadStart(delegate()
                        {
                            Thread.Sleep(100);
                            Console.WriteLine(c++);
                        }));
                    t.Start();
                }
            }
    


    我不明白,为什么输出不会有重复!

    以我以前对线程的理解,操作共享资源如果不加锁会出现同步的问题,多个线程同时对c++但是不明白为什么这里最后的输出居然没有一个重复。



    2011年9月28日 4:48

答案

全部回复

  • 你c是静态变量,而且每个线程都只启动后在去启动下一个线程。

    结果就是顺序累加的了。

     

     


    family as water
    2011年9月28日 5:15
  • 我 Thread.Sleep(100) 了

    2011年9月28日 5:17
  •  static int c = 0;
    
            static void Main(string[] args)
            {
                for (int i = 0; i < 10; i++)
                {
                    Thread t = new Thread(new ThreadStart(delegate()
                        {
                            Thread.Sleep(3000);
                            Console.WriteLine(c++);
                        }));
                    t.Start();
                }
            }
    

    你可以试试这段
    2011年9月28日 5:19
  • 已经不是线程问题了 那是局部问题了  你声明一个外部静态变量  再怎么线程不会对变量有影响的  值每次执行完毕 存储变量里面了  再次线程执行时候获取出来+1


    My Blog<
    2011年9月28日 14:15
    版主
  • 可是多线程同时对C进行累加 应 该会出现,C重复的问题,要不然这样我岂不是任何共享资源都不用加锁了?

    好比 2线程同时对 C相加,2线程同时把C的内容交换到寄存器里面,然后相加之后在返回进内存中,这时候C的值应该会是重复啊!

    难道我理解错了?

    2011年9月29日 2:34
  • dear

    因为你用了sleep,

    我门在建立线程时,没办法决定哪一线程先工作,但你用了sleep拖慢了下一个线程的执行时间,这让执行结果看起来都一样,这跟静态变量没啥关系,我会将线程的执行结果丢到属性里或是一个全域变量,让所有的线程共用,只要特别注意线程同步就好.

    http://www.dotblogs.com.tw/yc421206/archive/2011/01/07/20624.aspx

     


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年10月1日 16:35