class Program
{
private static int theLock = 0;//信号量
private static int i;//全局变量,每个线程共享该变量
[STAThread]
static void Main()
{
List<Task> tasks = new List<Task>();
for (int i = 0; i < 100000; i++)
{
tasks.Add(new Task(Increase));
}
tasks.ForEach(a => a.Start());//开启100000个线程
Task.WaitAll(tasks.ToArray());//阻塞主线程,等待所有子线程执行完毕
Console.WriteLine(i);//查看值,i==100000
Console.ReadKey();
}
private static void Increase()
{
//原子操作,判断当前线程有没有获取信号量;如果有,则阻塞当前线程10s;如果没有,则获取信号量,将信号量置为1
//Interlocked.CompareExchange(ref int location1, int value, int comparand)方法:
//如果location1等于comparand,则将value赋给location1,否则不做任何操作;方法始终返回location1的值
while (Interlocked.CompareExchange(ref theLock, 1, 0) == 1)
{
Thread.Sleep(10);
}
//执行操作
++i;
//释放信号量,将theLock的值改为0
Interlocked.Exchange(ref theLock, 0);
}
}
相关资料: