ReaderWriterLock.AcquireWriterLock Метод

Определение

Получает блокировку записи.

Перегрузки

AcquireWriterLock(Int32)

Получает блокировку записи, используя значение Int32 для задания времени ожидания.

AcquireWriterLock(TimeSpan)

Получает блокировку записи, используя значение TimeSpan для задания времени ожидания.

AcquireWriterLock(Int32)

Получает блокировку записи, используя значение Int32 для задания времени ожидания.

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

Параметры

millisecondsTimeout
Int32

Время ожидания в миллисекундах.

Исключения

Время ожидания, заданное параметром timeout, истекло до удовлетворения запроса на блокировку.

Примеры

В следующем примере кода показано, как получить и освободить блокировку записи, а также как обработать исключение, возникающее при истекавом времени ожидания запроса.

Этот код является частью более крупного примера, предоставленного ReaderWriterLock для класса .

// 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

Комментарии

Этот метод блокируется, если в другом потоке есть блокировка чтения или записи. Описание того, как блокировка модуля записи чередуется с несколькими параллельными блокировками чтения, см. в ReaderWriterLock классе .

Поток, у которого уже есть блокировка чтения, может получить блокировку модуля записи одним из двух способов: путем освобождения блокировки средства чтения перед вызовом AcquireWriterLockили путем вызова UpgradeToWriterLock.

Внимание!

Если поток вызывает AcquireWriterLock , пока он по-прежнему имеет блокировку чтения, он блокирует собственную блокировку чтения; если указано бесконечное время ожидания, поток будет взаимоблокироваться. Чтобы избежать таких взаимоблокировок, используйте , IsReaderLockHeld чтобы определить, есть ли в текущем потоке блокировка чтения.

AcquireWriterLock поддерживает рекурсивные запросы на блокировку записи. То есть поток может вызывать AcquireWriterLock несколько раз, что увеличивает количество блокировок каждый раз. При каждом вызове AcquireWriterLockнеобходимо вызывать ReleaseWriterLock один раз. Кроме того, можно вызвать метод ReleaseLock , чтобы немедленно уменьшить количество блокировок до нуля.

Запросы на рекурсивную блокировку всегда предоставляются немедленно, без помещения запрашивающего потока в очередь записи.

Допустимые значения времени ожидания см. в разделе ReaderWriterLock.

См. также раздел

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

AcquireWriterLock(TimeSpan)

Получает блокировку записи, используя значение TimeSpan для задания времени ожидания.

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

Параметры

timeout
TimeSpan

Период TimeSpan, задающий время ожидания.

Исключения

Время ожидания, заданное параметром timeout, истекло до удовлетворения запроса на блокировку.

Параметр timeout содержит отрицательное значение, отличное от -1.

Комментарии

Этот метод блокируется, если в другом потоке есть блокировка чтения или записи. Описание того, как блокировка модуля записи чередуется с несколькими параллельными блокировками чтения, см. в ReaderWriterLock классе .

Поток, у которого уже есть блокировка чтения, может получить блокировку модуля записи одним из двух способов: путем освобождения блокировки средства чтения перед вызовом AcquireWriterLockили путем вызова UpgradeToWriterLock.

Внимание!

Если поток вызывает AcquireWriterLock , пока он по-прежнему имеет блокировку чтения, он блокирует собственную блокировку чтения; если указано бесконечное время ожидания, поток будет взаимоблокироваться. Чтобы избежать таких взаимоблокировок, используйте , IsReaderLockHeld чтобы определить, есть ли в текущем потоке блокировка чтения.

AcquireWriterLock поддерживает рекурсивные запросы на блокировку записи. То есть поток может вызывать AcquireWriterLock несколько раз, что увеличивает количество блокировок каждый раз. При каждом вызове AcquireWriterLockнеобходимо вызывать ReleaseWriterLock один раз. Кроме того, можно вызвать метод ReleaseLock , чтобы немедленно уменьшить количество блокировок до нуля.

Запросы на рекурсивную блокировку всегда предоставляются немедленно, без помещения запрашивающего потока в очередь записи.

Допустимые значения времени ожидания см. в разделе ReaderWriterLock.

См. также раздел

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