设为首页 加入收藏

TOP

C#读写锁ReaderWriterLockSlim的使用(三)
2015-02-02 14:43:13 来源: 作者: 【 】 浏览:43
Tags:读写 ReaderWriterLockSlim 使用
(t);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? var t = Task.Factory.StartNew(WriteSomething);
? ? ? ? ? ? ? ? ? ? lstTask.Add(t);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? Task.WaitAll(lstTask.ToArray());
? ? ? ? ? ? sw.Stop();
? ? ? ? ? ? Console.WriteLine("使用ReaderWriterLockSlim方式,耗时:" + sw.Elapsed);
? ? ? ? ? ? sw.Restart();
? ? ? ? ? ? lstTask = new List();
? ? ? ? ? ? for (int i = 0; i < 500; i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if (i % 25 != 0)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? var t = Task.Factory.StartNew(ReadSomething_lock);
? ? ? ? ? ? ? ? ? ? lstTask.Add(t);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? var t = Task.Factory.StartNew(WriteSomething_lock);
? ? ? ? ? ? ? ? ? ? lstTask.Add(t);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? Task.WaitAll(lstTask.ToArray());
? ? ? ? ? ? sw.Stop();
? ? ? ? ? ? Console.WriteLine("使用lock方式,耗时:" + sw.Elapsed);
? ? ? ? }
? ? ? ? static private object _lock1 = new object();
? ? ? ? static public void ReadSomething_lock()
? ? ? ? {
? ? ? ? ? ? lock (_lock1)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //Console.WriteLine("{0} Thread ID {1} reading sth...", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode());
? ? ? ? ? ? ? ? Thread.Sleep(10);//模拟读取信息
? ? ? ? ? ? ? ? //Console.WriteLine("{0} Thread ID {1} reading end.", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode());
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? static public void WriteSomething_lock()
? ? ? ? {
? ? ? ? ? ? lock (_lock1)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //Console.WriteLine("{0} Thread ID {1} writing sth...", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode());
? ? ? ? ? ? ? ? Thread.Sleep(100);//模拟写入信息
? ? ? ? ? ? ? ? //Console.WriteLine("{0} Thread ID {1} writing end.", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode());
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? static public void ReadSomething()
? ? ? ? {
? ? ? ? ? ? rwl.EnterReadLock();
? ? ? ? ? ? try
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //Console.WriteLine("{0} Thread ID {1} reading sth...", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode());
? ? ? ? ? ? ? ? Thread.Sleep(10);//模拟读取信息
? ? ? ? ? ? ? ? //Console.WriteLine("{0} Thread ID {1} reading end.", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode());
? ? ? ? ? ? }
? ? ? ? ? ? finally
? ? ? ? ? ? {
? ? ? ? ? ? ? ? rwl.ExitReadLock();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? static public void WriteSomething()
? ? ? ? {
? ? ? ? ? ? rwl.EnterWriteLock();
? ? ? ? ? ? try
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //Console.WriteLine("{0} Thread ID {1} writing sth...", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode());
? ? ? ? ? ? ? ? Thread.Sleep(100);//模拟写入信息
? ? ? ? ? ? ? ? //Console.WriteLine("{0} Thread ID {1} writing end.", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode());
? ? ? ? ? ? }
? ? ? ? ? ? finally
? ? ? ? ? ? {
? ? ? ? ? ? ? ? rwl.ExitWriteLock();
? ? ? ? ? ? }
? ? ? ? }
? ? }


上述代码,就500个Task,每个Task占用一个线程池线程,其中20个写入线程和480个读取线程,模拟操作。其中读取数据花10ms,写入操作花100ms,分别测试了对于lock方式和ReaderWriterLockSlim方式。可以做一个估算,对于ReaderWriterLockSlim,假设480个线程同时读取,那么消耗10ms,20个写入操作占用2000ms,因此所消耗时间2010ms,而对于普通的lock方式,由于都是独占性的,因此480个读取操作占时间4800ms+20个写入操作2000ms=6800ms。运行结果显示了性能提升明显。


C#读写锁ReaderWriterLockSlim的使用


首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C#中Interlocked不能保证的事情 下一篇Python使用xinetd处理多客户端

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: