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. Это значит, что поток может вызывать Аккуиререадерлокк несколько раз, что увеличивает число блокировок каждый раз.That is, a thread can call AcquireReaderLock multiple times, which increments the lock count each time. Необходимо вызывать ReleaseReaderLock один раз для каждого вызова AcquireReaderLock.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.

Допустимые значения времени ожидания см. в ReaderWriterLockразделе.For 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. Это значит, что поток может вызывать Аккуиререадерлокк несколько раз, что увеличивает число блокировок каждый раз.That is, a thread can call AcquireReaderLock multiple times, which increments the lock count each time. Необходимо вызывать ReleaseReaderLock один раз для каждого вызова AcquireReaderLock.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.

Допустимые значения времени ожидания см. в ReaderWriterLockразделе.For valid time-out values, see ReaderWriterLock.

Дополнительно

Применяется к