【C#】【Thread】SpinLock
2016-12-30 15:23
567 查看
SpinLock结构是一个低级别的互斥同步基元,它在等待获取锁时进行旋转。 在多核计算机上,当等待时间预计较短且极少出现争用情况时,SpinLock 的性能将高于其他类型的锁。 不过,我们建议您仅在通过分析确定 System.Threading.Monitor 方法或 Interlocked 方法显著降低了程序的性能时使用 SpinLock。
即使 SpinLock 未获取锁,它也会产生线程的时间片。 它这样做是为了避免线程优先级别反转,并使垃圾回收器能够继续执行。 在使用 SpinLock 时,请确保任何线程持有锁的时间不会超过一个非常短的时间段,并确保任何线程在持有锁时不会阻塞。
由于 SpinLock 是一个值类型,因此,如果您希望两个副本都引用同一个锁,则必须通过引用显式传递该锁。
即使 SpinLock 未获取锁,它也会产生线程的时间片。 它这样做是为了避免线程优先级别反转,并使垃圾回收器能够继续执行。 在使用 SpinLock 时,请确保任何线程持有锁的时间不会超过一个非常短的时间段,并确保任何线程在持有锁时不会阻塞。
由于 SpinLock 是一个值类型,因此,如果您希望两个副本都引用同一个锁,则必须通过引用显式传递该锁。
public void SpinLockTest() { SpinLock sLock = new SpinLock(); StringBuilder sb = new StringBuilder(); Action action = () => { bool gotLock = false; for (int i = 0; i < 100; i++) { gotLock = false; try { sLock.Enter(ref gotLock);//加锁 sb.Append(i.ToString()); } finally { //真正获取之后,才释放 if (gotLock) sLock.Exit();//解锁 } } }; //多线程调用action Parallel.Invoke(action, action, action); Console.WriteLine("输出:{0}",sb.ToString()); }
相关文章推荐
- C#线程问题Threading.Thread
- Thread and Sync In C# (C#中的线程与同步)
- C#线程类Thread初步
- winform C# 的延迟函数 System.Threading.Thread.Sleep
- 游戏开发教程c# (转http://bbs.gameres.com/showthread.asp?threadid=19633)
- ThreadPool 线程池[c#]
- 用CheckForIllegalCrossThreadCalls 属性解决C#线程间操作无效
- [NET][THREAD]C#的多线程机制探索【精】
- How to: Use a Thread Pool (C# Programming Guide)
- Thread safe Singleton in C#
- C# 中Process 和 Thread 的启动
- C# 中的 ThreadPool
- C#学习笔记之四(Attribute, Reflection, Thread, Thread Syn
- C# terminate thread with stop variable
- C#线程类Thread初步
- c#的ThreadPool使用笔记(二)
- something about thread(c#)
- Thread(C#)
- C# WinForm多线程(二)---- ThreadPool 与 Timer
- C#线程系列讲座(2):Thread类的应用