ReaderWriterLock.AcquireReaderLock 方法

定義

取得讀取器的鎖定。Acquires a reader lock.

多載

AcquireReaderLock(Int32)

使用逾時值 Int32 取得讀取器的鎖定。Acquires a reader lock, using an Int32 value for the time-out.

AcquireReaderLock(TimeSpan)

使用逾時值 TimeSpan 取得讀取器的鎖定。Acquires a reader lock, using a TimeSpan value for the time-out.

AcquireReaderLock(Int32)

使用逾時值 Int32 取得讀取器的鎖定。Acquires a reader lock, using an Int32 value for the time-out.

public:
 void AcquireReaderLock(int millisecondsTimeout);
public void AcquireReaderLock (int millisecondsTimeout);
member this.AcquireReaderLock : int -> unit
Public Sub AcquireReaderLock (millisecondsTimeout As Integer)

參數

millisecondsTimeout
Int32

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

例外狀況

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

範例

下列程式碼範例顯示如何取得和釋放讀取器鎖定,以及如何處理要求超時時所擲回的例外狀況。The following code example shows how to acquire and release a reader lock, and how to handle the exception thrown when a request times out.

此程式碼是為 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 and release a reader lock, and
// how to handle time-outs.
static void ReadFromResource( 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 );
      }
      finally
      {

         // Ensure that the lock is released.
         rwl->ReleaseReaderLock();
      }

   }
   catch ( ApplicationException^ )
   {

      // The reader lock request timed out.
      Interlocked::Increment( readerTimeouts );
   }

}


// Request and release a reader lock, and handle time-outs.
static void ReadFromResource(int timeOut)
{
   try {
      rwl.AcquireReaderLock(timeOut);
      try {
         // It is safe for this thread to read from the shared 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);
   }
}
' Request and release a reader lock, and handle time-outs.
Sub ReadFromResource(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)
      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

備註

如果不同的執行緒具有寫入器鎖定,或至少有一個執行緒正在等候寫入器鎖定,AcquireReaderLock 會封鎖。AcquireReaderLock blocks if a different thread has the writer lock, or if at least one thread is waiting for the writer lock.

注意

如果目前的執行緒已經有寫入器鎖定,則不會取得讀取器鎖定。If the current thread already has the writer lock, no reader lock is acquired. 相反地,寫入器鎖定上的鎖定計數會遞增。Instead, the lock count on the writer lock is incremented. 這可防止執行緒封鎖自己的寫入器鎖定。This prevents a thread from blocking on its own writer lock. 結果與呼叫 AcquireWriterLock完全相同,而釋放寫入器鎖定時則需要額外的 ReleaseWriterLock 呼叫。The result is exactly the same as calling AcquireWriterLock, and an additional call to ReleaseWriterLock is required when releasing the writer lock.

AcquireReaderLock 支援遞迴讀取器鎖定要求。AcquireReaderLock supports recursive reader-lock requests. 也就是說,執行緒可以多次呼叫 AcquireReaderLock,這會在每次增加鎖定計數。That is, a thread can call AcquireReaderLock multiple times, which increments the lock count each time. 每次呼叫 AcquireReaderLock時,您都必須呼叫 ReleaseReaderLock 一次。You must call ReleaseReaderLock once for each time you call AcquireReaderLock. 或者,您可以呼叫 ReleaseLock,立即將鎖定計數減少為零。Alternatively, you can call ReleaseLock to reduce the lock count to zero immediately.

遞迴鎖定要求一律會立即被授與,而不會將要求的執行緒放在讀取器佇列中。Recursive lock requests are always granted immediately, without placing the requesting thread in the reader queue. 請小心使用遞迴鎖定,以避免長時間封鎖寫入器鎖定要求。Use recursive locks with caution, to avoid blocking writer-lock requests for long periods.

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

另請參閱

AcquireReaderLock(TimeSpan)

使用逾時值 TimeSpan 取得讀取器的鎖定。Acquires a reader lock, using a TimeSpan value for the time-out.

public:
 void AcquireReaderLock(TimeSpan timeout);
public void AcquireReaderLock (TimeSpan timeout);
member this.AcquireReaderLock : TimeSpan -> unit
Public Sub AcquireReaderLock (timeout As TimeSpan)

參數

timeout
TimeSpan

TimeSpan,指定逾時期間。A 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.

備註

如果不同的執行緒具有寫入器鎖定,或至少有一個執行緒正在等候寫入器鎖定,AcquireReaderLock 會封鎖。AcquireReaderLock blocks if a different thread has the writer lock, or if at least one thread is waiting for the writer lock.

注意

如果目前的執行緒已經有寫入器鎖定,則不會取得讀取器鎖定。If the current thread already has the writer lock, no reader lock is acquired. 相反地,寫入器鎖定上的鎖定計數會遞增。Instead, the lock count on the writer lock is incremented. 這可防止執行緒封鎖自己的寫入器鎖定。This prevents a thread from blocking on its own writer lock. 結果與呼叫 AcquireWriterLock完全相同,而釋放寫入器鎖定時則需要額外的 ReleaseWriterLock 呼叫。The result is exactly the same as calling AcquireWriterLock, and an additional call to ReleaseWriterLock is required when releasing the writer lock.

AcquireReaderLock 支援遞迴讀取器鎖定要求。AcquireReaderLock supports recursive reader-lock requests. 也就是說,執行緒可以多次呼叫 AcquireReaderLock,這會在每次增加鎖定計數。That is, a thread can call AcquireReaderLock multiple times, which increments the lock count each time. 每次呼叫 AcquireReaderLock時,您都必須呼叫 ReleaseReaderLock 一次。You must call ReleaseReaderLock once for each time you call AcquireReaderLock. 或者,您可以呼叫 ReleaseLock,立即將鎖定計數減少為零。Alternatively, you can call ReleaseLock to reduce the lock count to zero immediately.

遞迴鎖定要求一律會立即被授與,而不會將要求的執行緒放在讀取器佇列中。Recursive lock requests are always granted immediately, without placing the requesting thread in the reader queue. 請小心使用遞迴鎖定,以避免長時間封鎖寫入器鎖定要求。Use recursive locks with caution, to avoid blocking writer-lock requests for long periods.

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

另請參閱

適用於