Condividi tramite


ReaderWriterLock.UpgradeToWriterLock Metodo

Definizione

Consente l'aggiornamento da un blocco del lettore al blocco del writer.

Overload

UpgradeToWriterLock(Int32)

Aggiorna un blocco del lettore al blocco del writer, usando un valore Int32 per il timeout.

UpgradeToWriterLock(TimeSpan)

Aggiorna un blocco del lettore al blocco del writer, usando un valore TimeSpan per il timeout.

UpgradeToWriterLock(Int32)

Origine:
ReaderWriterLock.cs
Origine:
ReaderWriterLock.cs
Origine:
ReaderWriterLock.cs

Aggiorna un blocco del lettore al blocco del writer, usando un valore Int32 per il timeout.

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

Parametri

millisecondsTimeout
Int32

Timeout in millisecondi.

Restituisce

Valore LockCookie.

Attributi

Eccezioni

L'intervallo millisecondsTimeout scade prima che la richiesta di blocco sia stata soddisfatta.

Esempio

Nell'esempio di codice seguente viene illustrato come richiedere un blocco lettore, aggiornare il blocco del lettore a un blocco writer e effettuare di nuovo il downgrade a un blocco lettore.

Questo codice fa parte di un esempio più ampio fornito per la ReaderWriterLock classe .

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

Commenti

Quando un thread chiama UpgradeToWriterLock il blocco del lettore viene rilasciato, indipendentemente dal numero di blocchi e il thread passa alla fine della coda per il blocco del writer. Di conseguenza, altri thread potrebbero scrivere nella risorsa prima che al thread che ha richiesto l'aggiornamento venga concesso il blocco del writer.

Importante

L'eccezione di timeout non viene generata fino a quando il thread che ha chiamato il UpgradeToWriterLock metodo può riacquisire il blocco lettore. Se non sono presenti altri thread in attesa del blocco del writer, questo avviene immediatamente. Tuttavia, se un altro thread viene accodato per il blocco writer, il thread che ha chiamato il UpgradeToWriterLock metodo non può riacquisire il blocco del lettore finché tutti i lettori correnti non hanno rilasciato i blocchi e un thread ha acquisito e rilasciato il blocco del writer. Questo vale anche se l'altro thread che ha richiesto il blocco del writer lo ha richiesto dopo il thread corrente chiamato il UpgradeToWriterLock metodo .

Per ripristinare lo stato di blocco, chiamare DowngradeFromWriterLock utilizzando l'oggetto LockCookie restituito da UpgradeToWriterLock. Non usarlo LockCookie con RestoreLock.

Quando un thread non ha alcun blocco lettore, non usare UpgradeToWriterLock. In alternativa, utilizzare AcquireWriterLock.

Per i valori di timeout validi, vedere ReaderWriterLock.

Vedi anche

Si applica a

UpgradeToWriterLock(TimeSpan)

Origine:
ReaderWriterLock.cs
Origine:
ReaderWriterLock.cs
Origine:
ReaderWriterLock.cs

Aggiorna un blocco del lettore al blocco del writer, usando un valore TimeSpan per il timeout.

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

Parametri

timeout
TimeSpan

Parametro TimeSpan che specifica il periodo di timeout.

Restituisce

Valore LockCookie.

Attributi

Eccezioni

L'intervallo timeout scade prima che la richiesta di blocco sia stata soddisfatta.

Il parametro timeout specifica un valore negativo diverso da -1 millisecondi.

Commenti

Quando un thread chiama UpgradeToWriterLock il blocco del lettore viene rilasciato, indipendentemente dal numero di blocchi e il thread passa alla fine della coda per il blocco del writer. Di conseguenza, altri thread potrebbero scrivere nella risorsa prima che al thread che ha richiesto l'aggiornamento venga concesso il blocco del writer.

Importante

L'eccezione di timeout non viene generata fino a quando il thread che ha chiamato il UpgradeToWriterLock metodo può riacquisire il blocco lettore. Se non sono presenti altri thread in attesa del blocco del writer, questo avviene immediatamente. Tuttavia, se un altro thread viene accodato per il blocco writer, il thread che ha chiamato il UpgradeToWriterLock metodo non può riacquisire il blocco del lettore finché tutti i lettori correnti non hanno rilasciato i blocchi e un thread ha acquisito e rilasciato il blocco del writer. Questo vale anche se l'altro thread che ha richiesto il blocco del writer lo ha richiesto dopo il thread corrente chiamato il UpgradeToWriterLock metodo .

Per ripristinare lo stato di blocco, chiamare DowngradeFromWriterLock utilizzando l'oggetto LockCookie restituito da UpgradeToWriterLock. Non usarlo LockCookie con RestoreLock.

Quando un thread non ha alcun blocco lettore, non usare UpgradeToWriterLock. In alternativa, utilizzare AcquireWriterLock.

Per i valori di timeout validi, vedere ReaderWriterLock.

Vedi anche

Si applica a