ReaderWriterLock 用於同步存取資源。
Monitor)。
多重讀取器和單一寫入器交替,就不會長期鎖定讀取器和寫入器。
為獲得最佳效能,您不妨考慮重組應用程式將寫入期間縮至最小。
執行緒可以保留讀取器鎖定或寫入器鎖定,但不能同時執行。
DowngradeFromWriterLock。
遞迴鎖定要求會增加鎖定上的鎖定計數。
ReaderWriterLock 在讀取器集合和寫入器集合之間交替。
即使這些要求可以和現有讀取器鎖定的持有人共用並行存取,卻仍然不會同意這些要求;此一措施可以協助避免讀取器持續鎖定寫入器的情況。
此時除非使用逾時,否則執行緒會鎖死。
執行緒可以攔截這個例外狀況,並決定下一個採取動作。
下表顯示有效的逾時值 (以毫秒為單位)。
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
//读线程锁
static ReaderWriterLock m_ReadLock =new ReaderWriterLock();
static ReaderWriterLock m_WriteLock =new ReaderWriterLock();
//资源
staticint m_nResource =0;
//读取资源线程
staticvoid ReadProc()
{
for (int i =0; i <5; i++)
{
ReadResource(5000);
Thread.Sleep(500);
}
}
//写入资源线程
staticvoid WriteProc()
{
for (int i =0; i <5; i++)
{
WriteResource(5000);
Thread.Sleep(500);
}
}
//读取资源
privatestaticbool ReadResource(int timeout)
{
try
{
m_ReadLock.AcquireReaderLock(timeout);
try
{
Console.WriteLine("成功获得读线程锁, 资源值:{0}", m_nResource);
}
finally
{
m_ReadLock.ReleaseReaderLock();
}
}
catch (ApplicationException ex)
{
Console.WriteLine("获取锁超时:{0}", ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("获取锁异常:{0}", ex.Message);
}
returntrue;
}
//写入资源
privatestaticbool WriteResource(int timeout)
{
try
{
m_WriteLock.AcquireWriterLock(timeout);
try
{
Console.WriteLine("成功获得写线程锁, 资源值:{0}", m_nResource);
m_nResource++;
Console.WriteLine("写入资源 {0}", m_nResource);
}
finally
{
m_WriteLock.ReleaseWriterLock();
}
}
catch (ApplicationException ex)
{
Console.WriteLine("获取锁超时:{0}", ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("获取锁异常:{0}", ex.Message);
}
returntrue;
}
staticvoid Main(string[] args)
{
Thread t1 =new Thread(new ThreadStart(ReadProc));
Thread t2 =new Thread(new ThreadStart(WriteProc));
t1.Start();
t2.Start();
Thread.Sleep(5000);
Console.WriteLine("按任意键退出...");
Console.ReadKey();
}
}
}
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
//读线程锁
static ReaderWriterLock m_ReadLock =new ReaderWriterLock();
static ReaderWriterLock m_WriteLock =new ReaderWriterLock();
//资源
staticint m_nResource =0;
//读取资源线程
staticvoid ReadProc()
{
for (int i =0; i <5; i++)
{
ReadResource(5000);
Thread.Sleep(500);
}
}
//写入资源线程
staticvoid WriteProc()
{
for (int i =0; i <5; i++)
{
WriteResource(5000);
Thread.Sleep(500);
}
}
//读取资源
privatestaticbool ReadResource(int timeout)
{
try
{
m_ReadLock.AcquireReaderLock(timeout);
try
{
Console.WriteLine("成功获得读线程锁, 资源值:{0}", m_nResource);
}
finally
{
m_ReadLock.ReleaseReaderLock();
}
}
catch (ApplicationException ex)
{
Console.WriteLine("获取锁超时:{0}", ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("获取锁异常:{0}", ex.Message);
}
returntrue;
}
//写入资源
privatestaticbool WriteResource(int timeout)
{
try
{
m_WriteLock.AcquireWriterLock(timeout);
try
{
Console.WriteLine("成功获得写线程锁, 资源值:{0}", m_nResource);
m_nResource++;
Console.WriteLine("写入资源 {0}", m_nResource);
}
finally
{
m_WriteLock.ReleaseWriterLock();
}
}
catch (ApplicationException ex)
{
Console.WriteLine("获取锁超时:{0}", ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("获取锁异常:{0}", ex.Message);
}
returntrue;
}
staticvoid Main(string[] args)
{
Thread t1 =new Thread(new ThreadStart(ReadProc));
Thread t2 =new Thread(new ThreadStart(WriteProc));
t1.Start();
t2.Start();
Thread.Sleep(5000);
Console.WriteLine("按任意键退出...");
Console.ReadKey();
}
}
}