ReaderWriterLock.AcquireReaderLock Método

Definición

Adquiere un bloqueo de lector.Acquires a reader lock.

Sobrecargas

AcquireReaderLock(Int32)

Adquiere un bloqueo de lector, utilizando un valor Int32 para el tiempo de espera.Acquires a reader lock, using an Int32 value for the time-out.

AcquireReaderLock(TimeSpan)

Adquiere un bloqueo de lector, utilizando un valor TimeSpan para el tiempo de espera.Acquires a reader lock, using a TimeSpan value for the time-out.

AcquireReaderLock(Int32)

Adquiere un bloqueo de lector, utilizando un valor Int32 para el tiempo de espera.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)

Parámetros

millisecondsTimeout
Int32

Tiempo de espera en milisegundos.The time-out in milliseconds.

Excepciones

millisecondsTimeout expira antes de que se conceda la solicitud de bloqueo.millisecondsTimeout expires before the lock request is granted.

Ejemplos

En el ejemplo de código siguiente se muestra cómo adquirir y liberar un bloqueo de lector y cómo controlar la excepción que se produce cuando se agota el tiempo de espera de una solicitud.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.

Este código forma parte de un ejemplo más extenso proporcionado para la ReaderWriterLock clase.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

Comentarios

AcquireReaderLock bloquea si otro subproceso tiene el bloqueo de escritor o si al menos un subproceso está esperando el bloqueo de escritor.AcquireReaderLock blocks if a different thread has the writer lock, or if at least one thread is waiting for the writer lock.

Nota

Si el subproceso actual ya tiene el bloqueo de escritor, no se adquiere ningún bloqueo de lector.If the current thread already has the writer lock, no reader lock is acquired. En su lugar, se incrementa el recuento de bloqueos del bloqueo de escritor.Instead, the lock count on the writer lock is incremented. Esto evita que un subproceso se bloquee en su propio bloqueo de escritor.This prevents a thread from blocking on its own writer lock. El resultado es exactamente el mismo que llamar a AcquireWriterLock y se requiere una llamada adicional a ReleaseWriterLock cuando se libera el bloqueo de escritor.The result is exactly the same as calling AcquireWriterLock, and an additional call to ReleaseWriterLock is required when releasing the writer lock.

AcquireReaderLock admite solicitudes de bloqueo de lector recursivas.AcquireReaderLock supports recursive reader-lock requests. Es decir, un subproceso puede llamar varias veces a AcquireReaderLock, lo que incrementa el recuento de bloqueos cada vez.That is, a thread can call AcquireReaderLock multiple times, which increments the lock count each time. Debe llamar ReleaseReaderLock una vez para cada vez que llame a AcquireReaderLock .You must call ReleaseReaderLock once for each time you call AcquireReaderLock. Como alternativa, puede llamar ReleaseLock a para reducir el número de bloqueos a cero inmediatamente.Alternatively, you can call ReleaseLock to reduce the lock count to zero immediately.

Las solicitudes de bloqueo recursivos siempre se conceden inmediatamente, sin colocar el subproceso que realiza la solicitud en la cola del lector.Recursive lock requests are always granted immediately, without placing the requesting thread in the reader queue. Use bloqueos recursivos con precaución para evitar que bloquee las solicitudes de bloqueo del escritor durante períodos prolongados.Use recursive locks with caution, to avoid blocking writer-lock requests for long periods.

Para conocer los valores de tiempo de espera válidos, vea ReaderWriterLock .For valid time-out values, see ReaderWriterLock.

Se aplica a

AcquireReaderLock(TimeSpan)

Adquiere un bloqueo de lector, utilizando un valor TimeSpan para el tiempo de espera.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)

Parámetros

timeout
TimeSpan

Un TimeSpan que especifica el período de duración del tiempo de espera.A TimeSpan specifying the time-out period.

Excepciones

timeout expira antes de que se conceda la solicitud de bloqueo.timeout expires before the lock request is granted.

timeout especifica un valor negativo que no es -1 milisegundos.timeout specifies a negative value other than -1 milliseconds.

Comentarios

AcquireReaderLock bloquea si otro subproceso tiene el bloqueo de escritor o si al menos un subproceso está esperando el bloqueo de escritor.AcquireReaderLock blocks if a different thread has the writer lock, or if at least one thread is waiting for the writer lock.

Nota

Si el subproceso actual ya tiene el bloqueo de escritor, no se adquiere ningún bloqueo de lector.If the current thread already has the writer lock, no reader lock is acquired. En su lugar, se incrementa el recuento de bloqueos del bloqueo de escritor.Instead, the lock count on the writer lock is incremented. Esto evita que un subproceso se bloquee en su propio bloqueo de escritor.This prevents a thread from blocking on its own writer lock. El resultado es exactamente el mismo que llamar a AcquireWriterLock y se requiere una llamada adicional a ReleaseWriterLock cuando se libera el bloqueo de escritor.The result is exactly the same as calling AcquireWriterLock, and an additional call to ReleaseWriterLock is required when releasing the writer lock.

AcquireReaderLock admite solicitudes de bloqueo de lector recursivas.AcquireReaderLock supports recursive reader-lock requests. Es decir, un subproceso puede llamar varias veces a AcquireReaderLock, lo que incrementa el recuento de bloqueos cada vez.That is, a thread can call AcquireReaderLock multiple times, which increments the lock count each time. Debe llamar ReleaseReaderLock una vez para cada vez que llame a AcquireReaderLock .You must call ReleaseReaderLock once for each time you call AcquireReaderLock. Como alternativa, puede llamar ReleaseLock a para reducir el número de bloqueos a cero inmediatamente.Alternatively, you can call ReleaseLock to reduce the lock count to zero immediately.

Las solicitudes de bloqueo recursivos siempre se conceden inmediatamente, sin colocar el subproceso que realiza la solicitud en la cola del lector.Recursive lock requests are always granted immediately, without placing the requesting thread in the reader queue. Use bloqueos recursivos con precaución para evitar que bloquee las solicitudes de bloqueo del escritor durante períodos prolongados.Use recursive locks with caution, to avoid blocking writer-lock requests for long periods.

Para conocer los valores de tiempo de espera válidos, vea ReaderWriterLock .For valid time-out values, see ReaderWriterLock.

Se aplica a