ReaderWriterLock.AcquireWriterLock 메서드

정의

작성기 잠금을 가져옵니다.Acquires the writer lock.

오버로드

AcquireWriterLock(Int32)

제한 시간에 Int32 값을 사용하여 작성기 잠금을 가져옵니다.Acquires the writer lock, using an Int32 value for the time-out.

AcquireWriterLock(TimeSpan)

제한 시간에 TimeSpan 값을 사용하여 작성기 잠금을 가져옵니다.Acquires the writer lock, using a TimeSpan value for the time-out.

AcquireWriterLock(Int32)

제한 시간에 Int32 값을 사용하여 작성기 잠금을 가져옵니다.Acquires the writer lock, using an Int32 value for the time-out.

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

매개 변수

millisecondsTimeout
Int32

제한 시간(밀리초)입니다.The time-out in milliseconds.

예외

잠금 요청이 부여되기 전에 timeout이 만료된 경우timeout expires before the lock request is granted.

예제

다음 코드 예제에서는 작성기 잠금을 획득 하 고 해제 하는 방법과 요청 시간이 초과 될 때 throw 되는 예외를 처리 하는 방법을 보여 줍니다.The following code example shows how to acquire and release a writer 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 the writer lock, and
// how to handle time-outs.
static void WriteToResource( Random^ rnd, int timeOut )
{
   try
   {
      rwl->AcquireWriterLock( 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->ReleaseWriterLock();
      }

   }
   catch ( ApplicationException^ )
   {

      // The writer lock request timed out.
      Interlocked::Increment( writerTimeouts );
   }

}


// Request and release the writer lock, and handle time-outs.
static void WriteToResource(Random rnd, int timeOut)
{
   try {
      rwl.AcquireWriterLock(timeOut);
      try {
         // It's safe for this thread to access 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.ReleaseWriterLock();
      }
   }
   catch (ApplicationException) {
      // The writer lock request timed out.
      Interlocked.Increment(ref writerTimeouts);
   }
}
' Request and release the writer lock, and handle time-outs.
Sub WriteToResource(rnd As Random, timeOut As Integer)
   Try
      rwl.AcquireWriterLock(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.ReleaseWriterLock()
      End Try
   Catch ex As ApplicationException
      ' The writer lock request timed out.
      Interlocked.Increment(writerTimeouts)
   End Try
End Sub
};


}
End Module

설명

이 메서드는 다른 스레드에 판독기 잠금 또는 작성기 잠금이 있는 경우 차단 합니다.This method blocks if another thread has a reader lock or writer lock. 작성기 잠금이 여러 동시 판독기 잠금으로 대체 하는 방법에 대 한 설명은 클래스를 참조 하세요 ReaderWriterLock .For a description of the way the writer lock alternates with multiple concurrent reader locks, see the ReaderWriterLock class.

판독기 잠금이 이미 있는 스레드는를 호출 하기 전에 판독기 잠금을 해제 AcquireWriterLock 하거나를 호출 하 여 다음 두 가지 방법 중 하나로 작성기 잠금을 획득할 수 UpgradeToWriterLock 있습니다.A thread that already has a reader lock can acquire the writer lock in one of two ways: by releasing the reader lock before calling AcquireWriterLock, or by calling UpgradeToWriterLock.

주의

구독자가 판독기 잠금을 보유 하 고 있는 동안를 호출 하는 경우 AcquireWriterLock 에는 자체 판독기 잠금을 차단 합니다. 무한 시간 제한이 지정 된 경우 스레드는 교착 상태가 됩니다.If a thread calls AcquireWriterLock while it still has a reader lock, it will block on its own reader lock; if an infinite time-out is specified, the thread will deadlock. 이러한 교착 상태를 방지 하려면를 사용 IsReaderLockHeld 하 여 현재 스레드에 판독기 잠금이 이미 있는지 여부를 확인 합니다.To avoid such deadlocks, use IsReaderLockHeld to determine whether the current thread already has a reader lock.

AcquireWriterLock 는 재귀적 작성기 잠금 요청을 지원 합니다.AcquireWriterLock supports recursive writer-lock requests. 즉, 스레드는 매번 AcquireWriterLock 잠금 수를 증가 시키는 여러 번 호출할 수 있습니다.That is, a thread can call AcquireWriterLock multiple times, which increments the lock count each time. 를 호출할 때마다 한 번씩 호출 해야 합니다 ReleaseWriterLock AcquireWriterLock .You must call ReleaseWriterLock once for each time you call AcquireWriterLock. 또는를 호출 하 여 ReleaseLock 잠금 수를 즉시 0으로 줄일 수 있습니다.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 writer queue.

유효한 제한 시간 값은을 참조 하십시오 ReaderWriterLock .For valid time-out values, see ReaderWriterLock.

추가 정보

적용 대상

AcquireWriterLock(TimeSpan)

제한 시간에 TimeSpan 값을 사용하여 작성기 잠금을 가져옵니다.Acquires the writer lock, using a TimeSpan value for the time-out.

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

매개 변수

timeout
TimeSpan

제한 시간을 지정하는 TimeSpan입니다.The 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.

설명

이 메서드는 다른 스레드에 판독기 잠금 또는 작성기 잠금이 있는 경우 차단 합니다.This method blocks if another thread has a reader lock or writer lock. 작성기 잠금이 여러 동시 판독기 잠금으로 대체 하는 방법에 대 한 설명은 클래스를 참조 하세요 ReaderWriterLock .For a description of the way the writer lock alternates with multiple concurrent reader locks, see the ReaderWriterLock class.

판독기 잠금이 이미 있는 스레드는를 호출 하기 전에 판독기 잠금을 해제 AcquireWriterLock 하거나를 호출 하 여 다음 두 가지 방법 중 하나로 작성기 잠금을 획득할 수 UpgradeToWriterLock 있습니다.A thread that already has a reader lock can acquire the writer lock in one of two ways: by releasing the reader lock before calling AcquireWriterLock, or by calling UpgradeToWriterLock.

주의

구독자가 판독기 잠금을 보유 하 고 있는 동안를 호출 하는 경우 AcquireWriterLock 에는 자체 판독기 잠금을 차단 합니다. 무한 시간 제한이 지정 된 경우 스레드는 교착 상태가 됩니다.If a thread calls AcquireWriterLock while it still has a reader lock, it will block on its own reader lock; if an infinite time-out is specified, the thread will deadlock. 이러한 교착 상태를 방지 하려면를 사용 IsReaderLockHeld 하 여 현재 스레드에 판독기 잠금이 이미 있는지 여부를 확인 합니다.To avoid such deadlocks, use IsReaderLockHeld to determine whether the current thread already has a reader lock.

AcquireWriterLock 는 재귀적 작성기 잠금 요청을 지원 합니다.AcquireWriterLock supports recursive writer-lock requests. 즉, 스레드는 매번 AcquireWriterLock 잠금 수를 증가 시키는 여러 번 호출할 수 있습니다.That is, a thread can call AcquireWriterLock multiple times, which increments the lock count each time. 를 호출할 때마다 한 번씩 호출 해야 합니다 ReleaseWriterLock AcquireWriterLock .You must call ReleaseWriterLock once for each time you call AcquireWriterLock. 또는를 호출 하 여 ReleaseLock 잠금 수를 즉시 0으로 줄일 수 있습니다.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 writer queue.

유효한 제한 시간 값은을 참조 하십시오 ReaderWriterLock .For valid time-out values, see ReaderWriterLock.

추가 정보

적용 대상