ReaderWriterLock::UpgradeToWriterLock Method (Int32)
Upgrades a reader lock to the writer lock, using an Int32 value for the time-out.
Assembly: mscorlib (in mscorlib.dll)
Parameters
- millisecondsTimeout
-
Type:
System::Int32
The time-out in milliseconds.
| Exception | Condition |
|---|---|
| ApplicationException | millisecondsTimeout expires before the lock request is granted. |
When a thread calls UpgradeToWriterLock the reader lock is released, regardless of the lock count, and the thread goes to the end of the queue for the writer lock. Thus, other threads might write to the resource before the thread that requested the upgrade is granted the writer lock.
Important |
|---|
The time-out exception is not thrown until the thread that called the UpgradeToWriterLock method can reacquire the reader lock. If there are no other threads waiting for the writer lock, this happens immediately. However, if another thread is queued for the writer lock, the thread that called the UpgradeToWriterLock method cannot reacquire the reader lock until all current readers have released their locks, and one thread has acquired and released the writer lock. This is true even if the other thread that requested the writer lock requested it after the current thread called the UpgradeToWriterLock method. |
To restore the lock state, call DowngradeFromWriterLock using the LockCookie returned by UpgradeToWriterLock. Do not use this LockCookie with RestoreLock.
When a thread has no reader lock, do not use UpgradeToWriterLock. Use AcquireWriterLock instead.
For valid time-out values, see ReaderWriterLock.
The following code example shows how to request a reader lock, upgrade the reader lock to a writer lock, and downgrade to a reader lock again.
This code is part of a larger example provided for the ReaderWriterLock class.
// The complete code is located in the ReaderWriterLock // class topic. using namespace System; using namespace System::Threading; public ref class Test { public: // Declaring the ReaderWriterLock at the class level // makes it visible to all threads. static ReaderWriterLock^ rwl = gcnew ReaderWriterLock; // For this example, the shared resource protected by the // ReaderWriterLock is just an integer. static int resource = 0;
// Shows how to request a reader lock, upgrade the // reader lock to the writer lock, and downgrade to a // reader lock again. static void UpgradeDowngrade( int timeOut ) { try { rwl->AcquireReaderLock( timeOut ); try { // It is safe for this thread to read from // the shared resource. Display( String::Format( "reads resource value {0}", resource ) ); Interlocked::Increment( reads ); // If it is necessary to write to the resource, // you must either release the reader lock and // then request the writer lock, or upgrade the // reader lock. Note that upgrading the reader lock // puts the thread in the write queue, behind any // other threads that might be waiting for the // writer lock. try { LockCookie lc = rwl->UpgradeToWriterLock( timeOut ); try { // It is safe for this thread to read or write // from the shared resource. resource = rnd->Next( 500 ); Display( String::Format( "writes resource value {0}", resource ) ); Interlocked::Increment( writes ); } finally { // Ensure that the lock is released. rwl->DowngradeFromWriterLock( lc ); } } catch ( ApplicationException^ ) { // The upgrade request timed out. Interlocked::Increment( writerTimeouts ); } // When the lock has been downgraded, it is // still safe to read from the resource. Display( String::Format( "reads resource value {0}", resource ) ); Interlocked::Increment( reads ); } finally { // Ensure that the lock is released. rwl->ReleaseReaderLock(); } } catch ( ApplicationException^ ) { // The reader lock request timed out. Interlocked::Increment( readerTimeouts ); } }
Available since 1.1
