线程同步——SpinLock

作者:追风剑情 发布于:2017-9-25 20:40 分类:C#

当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程就循环等待。

优点:不会使线程进入阻塞状态,没有上下文切换。
缺点:循环等待消耗CPU。

自旋锁(SpinLock)使用场景:
① 多核CPU
② "事务"粒度小,很快处理完成
③ 自旋锁中的代码块不要使用Sleep(),因为一但休眠,就没法再次被自动唤醒。

示例: FCL的自旋锁


  1. using System;
  2. using System.Threading;
  3.  
  4. namespace SpinLockTest
  5. {
  6. class Program
  7. {
  8. //锁对象不能标记为readonly,因为在操作锁的时候,它的内部状态必须改变。
  9. static SpinLock spinLock = new SpinLock(true);
  10.  
  11. static void Main(string[] args)
  12. {
  13. Thread myThread;
  14. for (int i = 0; i < 5; i++)
  15. {
  16. myThread = new Thread(new ThreadStart(MyThreadProc));
  17. myThread.Name = String.Format("Thread{0}", i + 1);
  18. myThread.IsBackground = true;
  19. myThread.Start();
  20. }
  21.  
  22. Console.ReadKey();
  23. }
  24.  
  25. private static void MyThreadProc()
  26. {
  27. bool lockTaken = false;
  28. spinLock.Enter(ref lockTaken);
  29. if (lockTaken)
  30. {
  31. Console.WriteLine("{0} Thread Taken Lock", Thread.CurrentThread.Name);
  32. }
  33. else
  34. {
  35. Console.WriteLine("{0} Thread Not Taken Lock", Thread.CurrentThread.Name);
  36. }
  37. spinLock.Exit(false);
  38. Console.WriteLine("{0} Thread Exit", Thread.CurrentThread.Name);
  39. }
  40. }
  41. }


运行测试

111111.png

标签: C#

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号