ReaderWriterLock.UpgradeToWriterLock 方法

定義

讀取器鎖定升級至寫入器鎖定。Upgrades a reader lock to the writer lock.

多載

UpgradeToWriterLock(Int32)

使用逾時值 Int32,將讀取器鎖定升級至寫入器鎖定。Upgrades a reader lock to the writer lock, using an Int32 value for the time-out.

UpgradeToWriterLock(TimeSpan)

使用逾時值 TimeSpan,將讀取器鎖定升級至寫入器鎖定。Upgrades a reader lock to the writer lock, using a TimeSpan value for the time-out.

UpgradeToWriterLock(Int32)

使用逾時值 Int32,將讀取器鎖定升級至寫入器鎖定。Upgrades a reader lock to the writer lock, using an Int32 value for the time-out.

public:
 System::Threading::LockCookie UpgradeToWriterLock(int millisecondsTimeout);
public System.Threading.LockCookie UpgradeToWriterLock (int millisecondsTimeout);
member this.UpgradeToWriterLock : int -> System.Threading.LockCookie
Public Function UpgradeToWriterLock (millisecondsTimeout As Integer) As LockCookie

參數

millisecondsTimeout
Int32

逾時以毫秒為單位。The time-out in milliseconds.

傳回

例外狀況

millisecondsTimeout 在授與鎖定要求前過期。millisecondsTimeout expires before the lock request is granted.

範例

下列程式碼範例示範如何要求讀取器鎖定、將讀取器鎖定升級為寫入器鎖定,然後再次降級為讀取器鎖定。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.

此程式碼是為 ReaderWriterLock 類別提供的較大範例的一部分。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;

// The complete code is located in the ReaderWriterLock class topic.
using System;
using System.Threading;

public class Example
{
   static ReaderWriterLock rwl = new ReaderWriterLock();
   // Define the shared resource protected by the ReaderWriterLock.
   static int resource = 0;
' The complete code is located in the ReaderWriterLock class topic.
Imports System.Threading

Public Module Example
   Private rwl As New ReaderWriterLock()
   ' Define the shared resource protected by the ReaderWriterLock.
   Private resource As Integer = 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( Random^ rnd, 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 );
   }

}


// Requests a reader lock, upgrades the reader lock to the writer
// lock, and downgrades it to a reader lock again.
static void UpgradeDowngrade(Random rnd, int timeOut)
{
   try {
      rwl.AcquireReaderLock(timeOut);
      try {
         // It's safe for this thread to read from the shared resource.
         Display("reads resource value " + resource);
         Interlocked.Increment(ref reads);

         // To write to the resource, either release the reader lock and
         // request the writer lock, or upgrade the reader lock. 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's safe for this thread to read or write from the shared resource.
               resource = rnd.Next(500);
               Display("writes resource value " + resource);
               Interlocked.Increment(ref writes);
            }
            finally {
               // Ensure that the lock is released.
               rwl.DowngradeFromWriterLock(ref lc);
            }
         }
         catch (ApplicationException) {
            // The upgrade request timed out.
            Interlocked.Increment(ref writerTimeouts);
         }

         // If the lock was downgraded, it's still safe to read from the resource.
         Display("reads resource value " + resource);
         Interlocked.Increment(ref reads);
      }
      finally {
         // Ensure that the lock is released.
         rwl.ReleaseReaderLock();
      }
   }
   catch (ApplicationException) {
      // The reader lock request timed out.
      Interlocked.Increment(ref readerTimeouts);
   }
}
' Requests a reader lock, upgrades the reader lock to the writer
' lock, and downgrades it to a reader lock again.
Sub UpgradeDowngrade(rnd As Random, timeOut As Integer)
   Try
      rwl.AcquireReaderLock(timeOut)
      Try
         ' It's safe for this thread to read from the shared resource.
         Display("reads resource value " & resource)
         Interlocked.Increment(reads)
         
         ' To write to the resource, either release the reader lock and
         ' request the writer lock, or upgrade the reader lock. Upgrading
         ' the reader lock puts the thread in the write queue, behind any
         ' other threads that might be waiting for the writer lock.
         Try
            Dim lc As LockCookie = rwl.UpgradeToWriterLock(timeOut)
            Try
               ' It's safe for this thread to read or write from the shared resource.
               resource = rnd.Next(500)
               Display("writes resource value " & resource)
               Interlocked.Increment(writes)
            Finally
               ' Ensure that the lock is released.
               rwl.DowngradeFromWriterLock(lc)
            End Try
         Catch ex As ApplicationException
            ' The upgrade request timed out.
            Interlocked.Increment(writerTimeouts)
         End Try
         
         ' If the lock was downgraded, it's still safe to read from the resource.
         Display("reads resource value " & resource)
         Interlocked.Increment(reads)
      Finally
         ' Ensure that the lock is released.
         rwl.ReleaseReaderLock()
      End Try
   Catch ex As ApplicationException
      ' The reader lock request timed out.
      Interlocked.Increment(readerTimeouts)
   End Try
End Sub
};


}
End Module

備註

當執行緒呼叫 UpgradeToWriterLock 會釋放讀取器鎖定,而不論鎖定計數為何,執行緒會移至寫入器鎖定的佇列結尾。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.

重要

在呼叫 UpgradeToWriterLock 方法的執行緒可以重新執行讀取器鎖定之前,不會擲回超時例外狀況。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. 不過,如果有另一個執行緒排入寫入器鎖定的佇列,則呼叫 UpgradeToWriterLock 方法的執行緒無法重新取得讀取器鎖定,直到所有目前的讀取器都已釋放其鎖定,而且有一個執行緒已取得並釋放寫入器鎖定為止。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. 即使另一個要求寫入器鎖定的執行緒在目前的執行緒(稱為 UpgradeToWriterLock 方法)之後要求它,也是如此。This is true even if the other thread that requested the writer lock requested it after the current thread called the UpgradeToWriterLock method.

若要還原鎖定狀態,請使用 UpgradeToWriterLock傳回的 LockCookie 來呼叫 DowngradeFromWriterLockTo restore the lock state, call DowngradeFromWriterLock using the LockCookie returned by UpgradeToWriterLock. 請勿將此 LockCookie 用於 RestoreLockDo not use this LockCookie with RestoreLock.

當執行緒沒有讀取器鎖定時,請不要使用 UpgradeToWriterLockWhen a thread has no reader lock, do not use UpgradeToWriterLock. 請改用 AcquireWriterLockUse AcquireWriterLock instead.

如需有效的超時值,請參閱 ReaderWriterLockFor valid time-out values, see ReaderWriterLock.

另請參閱

UpgradeToWriterLock(TimeSpan)

使用逾時值 TimeSpan,將讀取器鎖定升級至寫入器鎖定。Upgrades a reader lock to the writer lock, using a TimeSpan value for the time-out.

public:
 System::Threading::LockCookie UpgradeToWriterLock(TimeSpan timeout);
public System.Threading.LockCookie UpgradeToWriterLock (TimeSpan timeout);
member this.UpgradeToWriterLock : TimeSpan -> System.Threading.LockCookie
Public Function UpgradeToWriterLock (timeout As TimeSpan) As LockCookie

參數

timeout
TimeSpan

TimeSpan,指定逾時期間。The TimeSpan specifying the time-out period.

傳回

例外狀況

timeout 在授與鎖定要求前過期。timeout expires before the lock request is granted.

timeout 可以指定 -1 毫秒以外的負值。timeout specifies a negative value other than -1 milliseconds.

備註

當執行緒呼叫 UpgradeToWriterLock 會釋放讀取器鎖定,而不論鎖定計數為何,執行緒會移至寫入器鎖定的佇列結尾。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.

重要

在呼叫 UpgradeToWriterLock 方法的執行緒可以重新執行讀取器鎖定之前,不會擲回超時例外狀況。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. 不過,如果有另一個執行緒排入寫入器鎖定的佇列,則呼叫 UpgradeToWriterLock 方法的執行緒無法重新取得讀取器鎖定,直到所有目前的讀取器都已釋放其鎖定,而且有一個執行緒已取得並釋放寫入器鎖定為止。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. 即使另一個要求寫入器鎖定的執行緒在目前的執行緒(稱為 UpgradeToWriterLock 方法)之後要求它,也是如此。This is true even if the other thread that requested the writer lock requested it after the current thread called the UpgradeToWriterLock method.

若要還原鎖定狀態,請使用 UpgradeToWriterLock傳回的 LockCookie 來呼叫 DowngradeFromWriterLockTo restore the lock state, call DowngradeFromWriterLock using the LockCookie returned by UpgradeToWriterLock. 請勿將此 LockCookie 用於 RestoreLockDo not use this LockCookie with RestoreLock.

當執行緒沒有讀取器鎖定時,請不要使用 UpgradeToWriterLockWhen a thread has no reader lock, do not use UpgradeToWriterLock. 請改用 AcquireWriterLockUse AcquireWriterLock instead.

如需有效的超時值,請參閱 ReaderWriterLockFor valid time-out values, see ReaderWriterLock.

另請參閱

適用於