讀寫鎖是通過調用AcquireReaderLock,ReleaseReaderLock,AcquireWriterLock,ReleaseWriterLock來完成讀鎖和寫鎖控制的
{
try
{ // 請求讀鎖,如果100ms超時退出
_rwlock.AcquireReaderLock(10);
try
{
int inx = _rand.Next(_list.Count);
if (inx < _list.Count)
Console.WriteLine("{0}thread {1}", thrdId, _list[inx]);
}
finally
{
_rwlock.ReleaseReaderLock();
}
}
catch (ApplicationException) // 如果請求讀鎖失敗
{
Console.WriteLine("{0}thread get reader lock out time!", thrdId);
}
}
static public void WriterThread()
{
try
{
// 請求寫鎖
_rwlock.AcquireWriterLock(100);
try
{
string val = _rand.Next(200).ToString();
_list.Add(val); // 寫入資源
Console.WriteLine("writer thread has written {0}", val);
}
finally
{ // 釋放寫鎖
_rwlock.ReleaseWriterLock();
}
}
catch (ApplicationException)
{
Console.WriteLine("Get writer thread lock out time!");
}
}
如果你想在讀的時候插入寫操作請使用UpgradeToWriterLock和DowngradeFromWriterLock來進行操作,而不是釋放讀鎖。
{
try
{
_rwlock.AcquireReaderLock(10);
try
{
try
{
// 提升讀鎖到寫鎖
LockCookie lc = _rwlock.UpgradeToWriterLock(100);
try
{
string val = _rand.Next(500).ToString();
_list.Add(val); Console.WriteLine("Upgrade Thread{0} add {1}", thrdId, val);
}
finally
{ // 下降寫鎖
_rwlock.DowngradeFromWriterLock(ref lc);
}
}
catch (ApplicationException)
{
Console.WriteLine("{0}thread upgrade reader lock failed!", thrdId);
}
}
finally
{
// 釋放原來的讀鎖
_rwlock.ReleaseReaderLock();
}
}
catch (ApplicationException)
{
Console.WriteLine("{0}thread get reader lock out time!", thrdId);
}
}
這裏有一點要注意的就是讀鎖和寫鎖的超時等待時間間隔的設置。通常情況下設置寫鎖的等待超時要比讀鎖的長,否則會經常發生寫鎖等待失敗的情況。