次の方法で共有


ReaderWriterLock.AcquireWriterLock メソッド

定義

ライター ロックを取得します。

オーバーロード

AcquireWriterLock(Int32)

タイムアウトに Int32 値を使用して、ライター ロックを取得します。

AcquireWriterLock(TimeSpan)

タイムアウトに TimeSpan 値を使用して、ライター ロックを取得します。

AcquireWriterLock(Int32)

ソース:
ReaderWriterLock.cs
ソース:
ReaderWriterLock.cs
ソース:
ReaderWriterLock.cs

タイムアウトに 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 参照してください。

既にリーダー ロックがあるスレッドは、2 つの方法のいずれかでライター ロックを取得できます。 を呼び出す前にリーダー ロックを解放するか、 を呼び出AcquireWriterLockUpgradeToWriterLockします。

注意事項

スレッドがまだリーダー ロックを持っている間に を呼び出 AcquireWriterLock すと、それ自体のリーダー ロックでブロックされます。無限のタイムアウトが指定されている場合、スレッドはデッドロックします。 このようなデッドロックを回避するには、 を使用 IsReaderLockHeld して、現在のスレッドに既にリーダー ロックがあるかどうかを判断します。

AcquireWriterLock は再帰的なライター ロック要求をサポートします。 つまり、スレッドは複数回を呼び出 AcquireWriterLock すことができます。これにより、毎回ロック数が増加します。 を呼び出す ReleaseWriterLock たびに、 を 1 回呼び出す AcquireWriterLock必要があります。 または、 を呼び出 ReleaseLock して、ロック数をすぐに 0 に減らすことができます。

再帰ロック要求は、要求スレッドをライター キューに配置せずに、常にすぐに許可されます。

有効なタイムアウト値については、「」を参照してください ReaderWriterLock

こちらもご覧ください

適用対象

AcquireWriterLock(TimeSpan)

ソース:
ReaderWriterLock.cs
ソース:
ReaderWriterLock.cs
ソース:
ReaderWriterLock.cs

タイムアウトに 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 参照してください。

既にリーダー ロックがあるスレッドは、2 つの方法のいずれかでライター ロックを取得できます。 を呼び出す前にリーダー ロックを解放するか、 を呼び出AcquireWriterLockUpgradeToWriterLockします。

注意事項

スレッドがまだリーダー ロックを持っている間に を呼び出 AcquireWriterLock すと、それ自体のリーダー ロックでブロックされます。無限のタイムアウトが指定されている場合、スレッドはデッドロックします。 このようなデッドロックを回避するには、 を使用 IsReaderLockHeld して、現在のスレッドに既にリーダー ロックがあるかどうかを判断します。

AcquireWriterLock は再帰的なライター ロック要求をサポートします。 つまり、スレッドは複数回を呼び出 AcquireWriterLock すことができます。これにより、毎回ロック数が増加します。 を呼び出す ReleaseWriterLock たびに、 を 1 回呼び出す AcquireWriterLock必要があります。 または、 を呼び出 ReleaseLock して、ロック数をすぐに 0 に減らすことができます。

再帰ロック要求は、要求スレッドをライター キューに配置せずに、常にすぐに許可されます。

有効なタイムアウト値については、「」を参照してください ReaderWriterLock

こちらもご覧ください

適用対象