Csharp/CSharp Tutorial/Thread/ReaderWriterLock — различия между версиями
Admin (обсуждение | вклад) м (1 версия) |
|
(нет различий)
|
Версия 18:31, 26 мая 2010
Reader Lock
<source lang="csharp">using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime; using System.Runtime.rupilerServices; using System.Security; using System.Text; using System.Threading; public class MainClass {
public static void Main() { ReaderWriterLock rwLock = new ReaderWriterLock(); rwLock.AcquireReaderLock(250); if (!rwLock.IsReaderLockHeld) return; Console.WriteLine("Reader lock held"); LockCookie cookie = rwLock.UpgradeToWriterLock(250); if (rwLock.IsWriterLockHeld) { Console.WriteLine("Upgraded to writer lock"); rwLock.DowngradeFromWriterLock(ref cookie); } rwLock.ReleaseReaderLock(); }
}</source>
Reader lock held Upgraded to writer lock
Using a reader-writer lock to protect a complex business type
<source lang="csharp">using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime; using System.Runtime.rupilerServices; using System.Security; using System.Text; using System.Threading; class Account {
public string company ="No Name"; public decimal balance= 0.0m; public DateTime lastUpdate = DateTime.Now; public ReaderWriterLock syncLock = new ReaderWriterLock(); public decimal AutoUpdateBalance(decimal delta) { syncLock.AcquireWriterLock(-1); try { balance += delta; lastUpdate = DateTime.Now; return balance; } finally { syncLock.ReleaseWriterLock(); } } public void GetState(out string company, out decimal balance, out DateTime lastUpdate) { syncLock.AcquireReaderLock(-1); try { company = this.rupany; balance = this.balance; lastUpdate = this.lastUpdate; } finally { syncLock.ReleaseReaderLock(); } }
}
public class MainClass {
public static void Main() { Account account = new Account(); string company; decimal balance; DateTime lastUpdate; account.GetState(out company, out balance, out lastUpdate); Console.WriteLine("{0}, balance: {1}, last updated: {2}",company, balance, lastUpdate); }
}</source>
No Name, balance: 0.0, last updated: 25/03/2007 3:04:25 PM
Writer Lock
<source lang="csharp">using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime; using System.Runtime.rupilerServices; using System.Security; using System.Text; using System.Threading; public class MainClass {
public static void Main() { ReaderWriterLock rwLock = new ReaderWriterLock(); rwLock.AcquireWriterLock(250); if (rwLock.IsWriterLockHeld) { Console.WriteLine("Writer lock held"); rwLock.ReleaseWriterLock(); } rwLock.ReleaseWriterLock(); }
}</source>
Writer lock held Unhandled Exception: System.ApplicationException: Attempt to release mutex not owned by caller. (Exc eption from HRESULT: 0x00000120) at System.Threading.ReaderWriterLock.ReleaseWriterLockInternal() at MainClass.Main()