自旋鎖-SpinLock(.NET 4.0+)
阿新 • • 發佈:2018-11-21
參考:https://www.cnblogs.com/1zhk/p/5269722.html 和 https://www.cnblogs.com/chenwolong/archive/2017/05/18/6872672.html
Parallel.ForEach 和 ForEach 與 Parallel.For 和 For 一樣,一個是非同步執行,開闢多個執行緒。一個是同步執行,開闢一個執行緒。
如果任務很小,那麼由於並行管理的附加開銷(任務分配,排程,同步等成本),可能並行執行並不是優化方案。
這裡我們使用了Parallel.For方法來做演示,Parallel.For用起來方便,但是在實際開發中還是儘量少用,因為它的不可控性太高,有點簡單粗暴的感覺,可能帶來一些不必要的"麻煩",
最好還是使用Task,因為Task的可控性較好。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ConsoleApp1 { public class SpinLockDemo { int i = 0; List<int> li = new List<int>(); SpinLock sl= new SpinLock(); public void Execute() { foo1(); //li.ForEach((t) => { Console.WriteLine(t); }); Console.WriteLine("Li Count - Spinlock: " + li.Count); Console.ReadKey(); } public void foo1() { Parallel.For(0, 10000, r => { bool gotLock = false; //釋放成功 try { sl.Enter(ref gotLock); //進入鎖 //Thread.Sleep(100); if (i == 0) { i = 1; li.Add(r); i = 0; } } finally { if (gotLock) sl.Exit(); //釋放 } }); } } class Program { static void Main(string[] args) { SpinLockDemo sp = new SpinLockDemo(); sp.Execute(); } } }