刚接触多线程 多线程应该是并发的,可是为什么我执行下面的代码时,有时候感觉又像是单线程的一样呢?
static void Main(string[] args)
        {
            ParameterizedThreadStart p = new ParameterizedThreadStart(wirtmsg1);
            ParameterizedThreadStart p1 = new ParameterizedThreadStart(wirtmsg2);
            Thread t1 = new Thread(p1);
            Thread t = new Thread(p);
            t.Start(2);
            t1.Start(3);
            wirtmsg(1);
            Console.ReadLine();
        }        static void wirtmsg(object o)
        {
            for (int i = 0; i <= 10; i++)
            {
                Console.WriteLine("我是线程{0}", o);
            }
        }        static void wirtmsg1(object o)
        {
            for (int i = 0; i <= 10; i++)
            {
                Console.WriteLine("我是线程{0}", o);
            }
        }        static void wirtmsg2(object o)
        {
            for (int i = 0; i <= 10; i++)
            {
                Console.WriteLine("我是线程{0}", o);
            }
        }
如果我这些线程都调用一个方法的话,显示的感觉执行的顺序又与分别调用不同方法的不一样。 迷茫中。。还希望各位帮帮小弟。。

解决方案 »

  1.   

    你需要了解一下线程的调度。线程有3个状态(这是最基本的,事实上windows下不止3种状态了。)
    Running,Ready,Wait
    三种状态顺序的转换,首先,某个线程创建,被放入wait队列,准备同步信号等变量,准备好后,放入Ready队列,当前Running的线程执行完一个时间片后,根据优先级插入到wait队列,此时从ready队列取出第一个线程,开始执行,当线程空闲时移到wait队列。
    这就是为什么线程中使用Sleep(0)可以看上去明显的减少竞争的缘故,Sleep(0)强制的让线程进入wait队列,不继续占用cpu。你这里,每个循环都是占用cpu后,不释放,所以当他执行完毕后,才会有其他线程有机会运行。
    如果是多核电脑可能会不同。
      

  2.   

    不用双核CPU也可以,执行线程的时候休眠一下,给其它线程机会.
      

  3.   

    你测试代码有点累赘。修改为这样。你可以看到竞争出现的结果。static void Main(string[] args)
    {
        ParameterizedThreadStart ThreadProc = o =>
        {
            int id = (int)o;
            for (int i = 0; i <= 10; i++)
            {
                Console.WriteLine("我是线程{0}", id);
                Thread.Sleep(0);
            }
        };
        new Thread(ThreadProc).Start(1);
        new Thread(ThreadProc).Start(2);
        new Thread(ThreadProc).Start(3);
        Console.ReadKey();
    }