1. 程式人生 > >自旋鎖-SpinLock(.NET 4.0+)

自旋鎖-SpinLock(.NET 4.0+)

參考: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(); } } }