ReaderWriterLock.AcquireReaderLock Method (Int32)


Acquires a reader lock, using an Int32 value for the time-out.

Namespace:   System.Threading
Assembly:  mscorlib (in mscorlib.dll)

public void AcquireReaderLock(
	int millisecondsTimeout


Type: System.Int32

The time-out in milliseconds.

Exception Condition

millisecondsTimeout expires before the lock request is granted.

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. The result is exactly the same as calling AcquireWriterLock, and an additional call to ReleaseWriterLock is required when releasing the writer lock.

AcquireReaderLock supports recursive reader-lock requests. That is, a thread can call AcquireReaderLock multiple times, which increments the lock count each time. You must call ReleaseReaderLock once for each time you call AcquireReaderLock. 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.

For valid time-out values, see ReaderWriterLock.

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.

This code is part of a larger example provided for the ReaderWriterLock class.

// 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;
// Request and release a reader lock, and handle time-outs.
static void ReadFromResource(int timeOut)
   try {
      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.
   catch (ApplicationException) {
      // The reader lock request timed out.
      Interlocked.Increment(ref readerTimeouts);

.NET Framework
Available since 1.1
Return to top