ReaderWriterLock.UpgradeToWriterLock 方法

定義

讀取器鎖定升級至寫入器鎖定。

多載

UpgradeToWriterLock(Int32)

使用逾時值 Int32,將讀取器鎖定升級至寫入器鎖定。

UpgradeToWriterLock(TimeSpan)

使用逾時值 TimeSpan,將讀取器鎖定升級至寫入器鎖定。

UpgradeToWriterLock(Int32)

來源:
ReaderWriterLock.cs
來源:
ReaderWriterLock.cs
來源:
ReaderWriterLock.cs

使用逾時值 Int32,將讀取器鎖定升級至寫入器鎖定。

public:
 System::Threading::LockCookie UpgradeToWriterLock(int millisecondsTimeout);
public System.Threading.LockCookie UpgradeToWriterLock (int millisecondsTimeout);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public System.Threading.LockCookie UpgradeToWriterLock (int millisecondsTimeout);
member this.UpgradeToWriterLock : int -> System.Threading.LockCookie
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
member this.UpgradeToWriterLock : int -> System.Threading.LockCookie
Public Function UpgradeToWriterLock (millisecondsTimeout As Integer) As LockCookie

參數

millisecondsTimeout
Int32

逾時以毫秒為單位。

傳回

LockCookie 值。

屬性

例外狀況

millisecondsTimeout 在授與鎖定要求前過期。

範例

下列程式碼範例示範如何要求讀取器鎖定、將讀取器鎖定升級至寫入器鎖定,然後再次降級為讀取器鎖定。

此程式碼是類別所提供較大範例的 ReaderWriterLock 一部分。

// 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 讀取器鎖定時,不論鎖定計數為何,執行緒都會移至寫入器鎖定的佇列結尾。 因此,其他執行緒可能會在要求升級的執行緒獲得寫入器鎖定之前寫入資源。

重要

除非呼叫 UpgradeToWriterLock 方法的執行緒可以重新取得讀取器鎖定,否則不會擲回逾時例外狀況。 如果沒有其他執行緒正在等候寫入器鎖定,就會立即發生。 不過,如果另一個執行緒排入寫入器鎖定佇列,呼叫 UpgradeToWriterLock 方法的執行緒就無法重新取得讀取器鎖定,直到所有目前的讀取器都釋放其鎖定,而且一個執行緒已取得並釋放寫入器鎖定為止。 即使要求寫入器鎖定的其他執行緒在呼叫 方法的目前線程 UpgradeToWriterLock 之後要求它,也是如此。

若要還原鎖定狀態,請使用 LockCookieUpgradeToWriterLock 傳回的 呼叫 DowngradeFromWriterLock 。 請勿將此與 搭配 RestoreLock 使用 LockCookie

當執行緒沒有讀取器鎖定時,請勿使用 UpgradeToWriterLock 。 請改用 AcquireWriterLock

如需有效的逾時值,請參閱 ReaderWriterLock

另請參閱

適用於

UpgradeToWriterLock(TimeSpan)

來源:
ReaderWriterLock.cs
來源:
ReaderWriterLock.cs
來源:
ReaderWriterLock.cs

使用逾時值 TimeSpan,將讀取器鎖定升級至寫入器鎖定。

public:
 System::Threading::LockCookie UpgradeToWriterLock(TimeSpan timeout);
public System.Threading.LockCookie UpgradeToWriterLock (TimeSpan timeout);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public System.Threading.LockCookie UpgradeToWriterLock (TimeSpan timeout);
member this.UpgradeToWriterLock : TimeSpan -> System.Threading.LockCookie
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
member this.UpgradeToWriterLock : TimeSpan -> System.Threading.LockCookie
Public Function UpgradeToWriterLock (timeout As TimeSpan) As LockCookie

參數

timeout
TimeSpan

TimeSpan,指定逾時期間。

傳回

LockCookie 值。

屬性

例外狀況

timeout 在授與鎖定要求前過期。

timeout 可以指定 -1 毫秒以外的負值。

備註

當執行緒呼叫 UpgradeToWriterLock 讀取器鎖定時,不論鎖定計數為何,執行緒都會移至寫入器鎖定的佇列結尾。 因此,其他執行緒可能會在要求升級的執行緒獲得寫入器鎖定之前寫入資源。

重要

除非呼叫 UpgradeToWriterLock 方法的執行緒可以重新取得讀取器鎖定,否則不會擲回逾時例外狀況。 如果沒有其他執行緒正在等候寫入器鎖定,就會立即發生。 不過,如果另一個執行緒排入寫入器鎖定佇列,呼叫 UpgradeToWriterLock 方法的執行緒就無法重新取得讀取器鎖定,直到所有目前的讀取器都釋放其鎖定,而且一個執行緒已取得並釋放寫入器鎖定為止。 即使要求寫入器鎖定的其他執行緒在呼叫 方法的目前線程 UpgradeToWriterLock 之後要求它,也是如此。

若要還原鎖定狀態,請使用 LockCookieUpgradeToWriterLock 傳回的 呼叫 DowngradeFromWriterLock 。 請勿將此與 搭配 RestoreLock 使用 LockCookie

當執行緒沒有讀取器鎖定時,請勿使用 UpgradeToWriterLock 。 請改用 AcquireWriterLock

如需有效的逾時值,請參閱 ReaderWriterLock

另請參閱

適用於