多个线程(不仅仅局限于相同进程)如果需要访问相同的可变资源的话就可能需要考虑到线程同步的手段。CPU的线程和进程管控我这里就不去说了,计算机组成原理里面的东西
那么既然要让线程的步调一致,那么我们首先可以想到的是,如果一个线程没有完成我们就等,一直等到它完成,但是这种方法会耗费CPU的资源
Stopwatch sw = Stopwatch.StartNew(); Thread t1 = new Thread(() => { Thread.Sleep(1000); result = 100; }); t1.Start(); Thread.Sleep(500); while (t1.IsAlive) ; Console.WriteLine(sw.ElapsedMilliseconds); Console.WriteLine(result);
除了这种方式,还可以做轮询的方式,因为傻傻的等实在是太浪费资源了,那么我们每次都去检查一下线程是不是在跑就行了
Stopwatch sw = Stopwatch.StartNew(); Thread t1 = new Thread(() => { Thread.Sleep(1000); result = 100; }); t1.Start(); Thread.Sleep(500); while (t1.IsAlive) Thread.Sleep(500); Console.WriteLine(sw.ElapsedMilliseconds); Console.WriteLine(result);
另外就是使用join的方式进行阻塞
Stopwatch sw = Stopwatch.StartNew(); Thread t1 = new Thread(() => { Thread.Sleep(1000); result = 100; }); t1.Start(); Thread.Sleep(500); t1.Join(); Console.WriteLine(sw.ElapsedMilliseconds); Console.WriteLine(result);
然后再看看锁的用法吧,锁在线程里面用的还是蛮多的,除非你用线程池进行多线程管控,相对而言的话锁还是很好的处理机制,让线程按照顺序依次执行
Stopwatch sw = Stopwatch.StartNew(); Thread t1 = new Thread(() => { lock (locker) { Thread.Sleep(1000); result = 100; } }); t1.Start(); Thread.Sleep(100); lock (locker) { Console.WriteLine(sw.ElapsedMilliseconds); Console.WriteLine(result); }