using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace Lock
{
    class Program
    {
        static void Main(string[] args)
        {
            testlock();
        }
        public static void testlock()
        {
            ManualResetEventSlim mre = new ManualResetEventSlim(false, 100);
            SemaphoreSlim sem = new SemaphoreSlim(2);
            int i = 0;
            Task task=Task.Factory.StartNew(()=>
            {
                //do
                //{
                //    Console.WriteLine("task i is {0}", i);
                //    Console.ReadLine();
                //}
                //while (i < 10);
                //mre.Set();
                for (i = 0; i < 10; i++)
                {
                    Console.WriteLine("task i is {0}", i);
                  
                }
                mre.Set();
                sem.Wait();
                sem.Release();
            }
                );
            Task task2 = Task.Factory.StartNew(() =>
            {
                //mre.Wait();
                Console.WriteLine("task2 i is {0}", i);
                Console.WriteLine("1111111111");
                Console.ReadLine();
            }
            );
            Task task3 = Task.Factory.StartNew(() => 
            {
                Console.WriteLine("2222");
            }
            );
            Task.WaitAll(task, task2,task3);
        }    }
}
现在问题是每次输出的顺序都不同,求解释

解决方案 »

  1.   

    线程由created,变成了WaitingToRun,但是每个线程都有运行的机会,这个就要看操作系统的调度了呀!所以,结果是应该不一样的。
      

  2.   

    ......
    task.wait(a)
    ......
    task.wait(b)
    ......
    task.wait(c)
      

  3.   

    线程之间本来就是没有顺序的,很随意的,要是享有顺序必须要对其加锁,还有sleep下~
      

  4.   

    也不绝对,多线程的用处,不考虑复杂的情况主要有两点1.使各个功能模块之间相互不阻塞2.并行计算,提高效率首先你确认下自己有没有多线程的必要如果确实有,一个线程又依赖与另一个线程的结果,那最好做成队列形式(也可以使其他的方式,思想类似),两个线程共享一个数据队列,一个填数据,一个监听队列并在有数据时操作。你就理解成类似于socket通信那样的,一个发送,一个监听
      

  5.   

    C#用的少,是不是更方便不清楚,在C(Windows API)中,队列的加锁同步,防止空队列造成CPU空转所做的事件睡眠都要自己考虑。
      

  6.   

    线程的执行,本来就有不确定性,它的切换是不确定的
    如下:class Threads
            {
                public const int Repet = 1000;
                public static void Main()
                {
                    ThreadStart threadStart = new ThreadStart(DoWock);
                    Thread thread = new Thread(threadStart);
                    thread.Start();                for (int count = 0; count < Repet; count++)
                    {
                        Console.Write('-');
                    }
                    thread.Join();
                }            public static void DoWock()
                {
                    for (int count = 0; count < Repet; count++)
                    {
                        Console.Write('.');
                    }
                }
            }该程序的输出结果是不确定的