ReaderWriterLock.UpgradeToWriterLock 方法

定义

将读线程锁升级为写线程锁。

重载

UpgradeToWriterLock(Int32)

使用一个 Int32 超时值将读线程锁升级为写线程锁。

UpgradeToWriterLock(TimeSpan)

使用一个 TimeSpan 超时值将读线程锁升级为写线程锁。

UpgradeToWriterLock(Int32)

Source:
ReaderWriterLock.cs
Source:
ReaderWriterLock.cs
Source:
ReaderWriterLock.cs

使用一个 Int32 超时值将读线程锁升级为写线程锁。

public:
 System::Threading::LockCookie UpgradeToWriterLock(int millisecondsTimeout);
public System.Threading.LockCookie UpgradeToWriterLock (int millisecondsTimeout);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public System.Threading.LockCookie UpgradeToWriterLock (int millisecondsTimeout);
member this.UpgradeToWriterLock : int -> System.Threading.LockCookie
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
member this.UpgradeToWriterLock : int -> System.Threading.LockCookie
Public Function UpgradeToWriterLock (millisecondsTimeout As Integer) As LockCookie

参数

millisecondsTimeout
Int32

以毫秒为单位的超时。

返回

一个 LockCookie 值。

属性

例外

millisecondsTimeout 在授予锁定请求前过期。

示例

下面的代码示例演示如何请求读取器锁、将读取器锁升级到编写器锁,以及如何再次降级到读取器锁。

此代码是为 类提供的更大示例的 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 a reader lock, upgrade the
// reader lock to the writer lock, and downgrade to a
// reader lock again.
static void UpgradeDowngrade( Random^ rnd, 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 );

         // If it is necessary to write to the resource,
         // you must either release the reader lock and
         // then request the writer lock, or upgrade the
         // reader lock. Note that upgrading the reader lock
         // puts the thread in the write queue, behind any
         // other threads that might be waiting for the
         // writer lock.
         try
         {
            LockCookie lc = rwl->UpgradeToWriterLock( 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->DowngradeFromWriterLock( lc );
            }

         }
         catch ( ApplicationException^ )
         {

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


         // When the lock has been downgraded, it is
         // still safe to read from the 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 );
   }

}
// Requests a reader lock, upgrades the reader lock to the writer
// lock, and downgrades it to a reader lock again.
static void UpgradeDowngrade(Random rnd, int timeOut)
{
   try {
      rwl.AcquireReaderLock(timeOut);
      try {
         // It's safe for this thread to read from the shared resource.
         Display("reads resource value " + resource);
         Interlocked.Increment(ref reads);

         // To write to the resource, either release the reader lock and
         // request the writer lock, or upgrade the reader lock. Upgrading
         // the reader lock puts the thread in the write queue, behind any
         // other threads that might be waiting for the writer lock.
         try {
            LockCookie lc = rwl.UpgradeToWriterLock(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(ref writes);
            }
            finally {
               // Ensure that the lock is released.
               rwl.DowngradeFromWriterLock(ref lc);
            }
         }
         catch (ApplicationException) {
            // The upgrade request timed out.
            Interlocked.Increment(ref writerTimeouts);
         }

         // If the lock was downgraded, it's still safe to read from the 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);
   }
}
' Requests a reader lock, upgrades the reader lock to the writer
' lock, and downgrades it to a reader lock again.
Sub UpgradeDowngrade(rnd As Random, 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)
         
         ' To write to the resource, either release the reader lock and
         ' request the writer lock, or upgrade the reader lock. Upgrading
         ' the reader lock puts the thread in the write queue, behind any
         ' other threads that might be waiting for the writer lock.
         Try
            Dim lc As LockCookie = rwl.UpgradeToWriterLock(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.DowngradeFromWriterLock(lc)
            End Try
         Catch ex As ApplicationException
            ' The upgrade request timed out.
            Interlocked.Increment(writerTimeouts)
         End Try
         
         ' If the lock was downgraded, it's still safe to read from the 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

注解

当线程调用 UpgradeToWriterLock 时,无论锁计数如何,都会释放读取器锁,并且线程将进入写入器锁的队列末尾。 因此,在请求升级的线程被授予写入器锁之前,其他线程可能会写入资源。

重要

在调用 UpgradeToWriterLock 方法的线程可以重新获取读取器锁之前,不会引发超时异常。 如果没有其他线程正在等待编写器锁,则会立即发生这种情况。 但是,如果另一个线程排队等待编写器锁,则调用 UpgradeToWriterLock 方法的线程无法重新获取读取器锁,直到所有当前读取器都释放其锁,并且一个线程已获取并释放编写器锁。 即使请求编写器锁的其他线程在调用 UpgradeToWriterLock 方法的当前线程之后请求它,也是如此。

若要还原锁定状态,请使用 LockCookie 返回的 UpgradeToWriterLock调用DowngradeFromWriterLock。 不要将此 LockCookie 与 一起使用 RestoreLock

当线程没有读取器锁时,请勿使用 UpgradeToWriterLock。 请改用 AcquireWriterLock

有关有效的超时值,请参阅 ReaderWriterLock

另请参阅

适用于

UpgradeToWriterLock(TimeSpan)

Source:
ReaderWriterLock.cs
Source:
ReaderWriterLock.cs
Source:
ReaderWriterLock.cs

使用一个 TimeSpan 超时值将读线程锁升级为写线程锁。

public:
 System::Threading::LockCookie UpgradeToWriterLock(TimeSpan timeout);
public System.Threading.LockCookie UpgradeToWriterLock (TimeSpan timeout);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public System.Threading.LockCookie UpgradeToWriterLock (TimeSpan timeout);
member this.UpgradeToWriterLock : TimeSpan -> System.Threading.LockCookie
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
member this.UpgradeToWriterLock : TimeSpan -> System.Threading.LockCookie
Public Function UpgradeToWriterLock (timeout As TimeSpan) As LockCookie

参数

timeout
TimeSpan

TimeSpan,用于指定超时时间。

返回

一个 LockCookie 值。

属性

例外

timeout 在授予锁定请求前过期。

timeout 可指定 -1 毫秒以外的任何负值。

注解

当线程调用 UpgradeToWriterLock 时,无论锁计数如何,都会释放读取器锁,并且线程将进入写入器锁的队列末尾。 因此,在请求升级的线程被授予写入器锁之前,其他线程可能会写入资源。

重要

在调用 UpgradeToWriterLock 方法的线程可以重新获取读取器锁之前,不会引发超时异常。 如果没有其他线程正在等待编写器锁,则会立即发生这种情况。 但是,如果另一个线程排队等待编写器锁,则调用 UpgradeToWriterLock 方法的线程无法重新获取读取器锁,直到所有当前读取器都释放其锁,并且一个线程已获取并释放编写器锁。 即使请求编写器锁的其他线程在调用 UpgradeToWriterLock 方法的当前线程之后请求它,也是如此。

若要还原锁定状态,请使用 LockCookie 返回的 UpgradeToWriterLock调用DowngradeFromWriterLock。 不要将此 LockCookie 与 一起使用 RestoreLock

当线程没有读取器锁时,请勿使用 UpgradeToWriterLock。 请改用 AcquireWriterLock

有关有效的超时值,请参阅 ReaderWriterLock

另请参阅

适用于