NET多线程同步方法:自由锁(InterLocked)
来源:互联网 发布:总结网络推广的工具 编辑:程序博客网 时间:2024/06/08 04:20
1. 维护自由锁(InterLocked)实现同步
2. 监视器(Monitor)和互斥锁(lock)
3. 读写锁(ReadWriteLock)
4. 系统内核对象
1) 互斥(Mutex), 信号量(Semaphore), 事件(AutoResetEvent/ManualResetEvent)
2) 线程池
除了以上的这些对象之外实现线程同步的还可以使用Thread.Join方法。这种方法比较简单,当你在第一个线程运行时想等待第二个线程执行结果,那么你可以让第二个线程Join进来就可以了。
自由锁(InterLocked)
对一个32位的整型数进行递增和递减操作来实现锁,有人会问为什么不用++或--来操作。因为在多线程中对锁进行操作必须是原子的,而++和--不具备这个能力。InterLocked类还提供了两个另外的函数Exchange, CompareExchange用于实现交换和比较交换。Exchange操作会将新值设置到变量中并返回变量的原来值: int oVal = InterLocked.Exchange(ref val, 1)。
监视器(Monitor)
在MSDN中对Monitor的描述是: Monitor 类通过向单个线程授予对象锁来控制对对象的访问。
Monitor类是一个静态类因此你不能通过实例化来得到类的对象。Monitor的成员可以查看MSDN,基本上Monitor的效果和lock是一样的,通过加锁操作Enter设置临界区,完成操作后使用Exit操作来释放对象锁。不过相对来说Monitor的功能更强,Moniter可以进行测试锁的状态,因此你可以控制对临界区的访问选择,等待or离开, 而且Monitor还可以在释放锁之前通知指定的对象,更重要的是使用Monitor可以跨越方法来操作。Monitor提供的方法很少就只有获取锁的方法Enter, TryEnter;释放锁的方法Wait, Exit;还有消息通知方法Pulse, PulseAll。经典的Monitor操作是这样的:
// 通监视器来创建临界区 static public void DelUser(string name) { try { // 等待线程进入 Monitor.Enter(Names); Names.Remove(name); Console.WriteLine("Del: {0}", Names.Count); Monitor.Pulse(Names); } finally { // 释放对象锁 Monitor.Exit(Names); } } }
其中Names是一个List<string>, 这里有一个小技巧,如果你想声明整个方法为线程同步可以使用方法属性:
// 通过属性设置整个方法为临界区 [MethodImpl(MethodImplOptions.Synchronized)] static public void AddUser(string name) { Names.Add(name); Console.WriteLine("Add: {0}",Names.Count); }
对于Monitor的使用有一个方法是比较诡异的,那就是Wait方法。在MSDN中对Wait的描述是: 释放对象上的锁以便允许其他线程锁定和访问该对象。
这里提到的是先释放锁,那么显然我们需要先得到锁,否则调用Wait会出现异常,所以我们必须在Wait前面调用Enter方法或其他获取锁的方法,如lock,这点很重要。对应Enter方法,Monitor给出来另一种实现TryEnter。这两种方法的主要区别在于是否阻塞当前线程,Enter方法在获取不到锁时,会阻塞当前线程直到得到锁。不过缺点是如果永远得不到锁那么程序就会进入死锁状态。我们可以采用Wait来解决,在调用Wait时加入超时时限就可以。
if (Monitor.TryEnter(Names)) { Monitor.Wait(Names, 1000); // !! Names.Remove(name); Console.WriteLine("Del: {0}", Names.Count); Monitor.Pulse(Names); }
参见:http://blog.0734link.com/Article/654.aspx
- NET多线程同步方法:自由锁(InterLocked)
- .NET多线程同步方法详解(一):自由锁(InterLocked)
- NET多线程同步方法详解(一):自由锁(InterLocked)
- NET多线程同步方法详解(一):自由锁(InterLocked)
- 自由锁(InterLocked)
- 多线程同步 -原子操作 (Interlocked系列函数)
- .NET线程同步之Interlocked和ReadWrite锁
- NET 多线程同步方法:读写锁(ReadWriteLock)
- NET多线程同步方法:互斥锁(Lock)
- .NET线程同步之Interlocked构造
- 多线程、进程(二Interlocked)
- .NET多线程同步方法详解
- 用户模式下的多线程同步——原子访问(Interlocked系列函数)
- 线程同步(使用Interlocked类)
- NET多线程同步方法详解(三):读写锁(ReadWriteLock)
- NET多线程同步方法详解(三):读写锁(ReadWriteLock) 收藏
- NET多线程同步方法详解(三):读写锁(ReadWriteLock)
- 《Win32多线程程序设计》(8)---Interlocked Variables
- Maven之环境配置(一)
- QT与数据库连接实例
- javascript取得css中的属性值
- php-Arrays 函数-array_diff_key-使用键名比较计算数组的差值
- libevent在异步socket中的使用
- NET多线程同步方法:自由锁(InterLocked)
- 易购 新推24点 霸王条款(有图有真相)
- Linux上的free命令详解
- 自由挥洒灵感 Sensu画笔让你Draw Something Amazing
- 使用pycurl获取http请求的content-length
- PHP/JAVA 加密网站地址——从根本解决盗连
- Unicode详解
- Ubuntu 10.04.3配置Samba服务
- 一步一步教会你使用GCC,附实例