ReaderWriterLock.UpgradeToWriterLock Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
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 |
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.