ReaderWriterLock.UpgradeToWriterLock Método
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Atualiza um bloqueio do leitor para o bloqueio do escritor.
Sobrecargas
| Name | Description |
|---|---|
| UpgradeToWriterLock(Int32) |
Atualiza um bloqueio de leitor para o bloqueio do escritor, usando um Int32 valor para o time-out. |
| UpgradeToWriterLock(TimeSpan) |
Atualiza um bloqueio de leitor para o bloqueio do escritor, usando um |
UpgradeToWriterLock(Int32)
Atualiza um bloqueio de leitor para o bloqueio do escritor, usando um Int32 valor para o time-out.
public:
System::Threading::LockCookie UpgradeToWriterLock(int millisecondsTimeout);
public System.Threading.LockCookie UpgradeToWriterLock(int millisecondsTimeout);
member this.UpgradeToWriterLock : int -> System.Threading.LockCookie
Public Function UpgradeToWriterLock (millisecondsTimeout As Integer) As LockCookie
Parâmetros
- millisecondsTimeout
- Int32
O tempo em milissegundos.
Devoluções
Um valor de LockCookie.
Exceções
millisecondsTimeout expira antes de o pedido de bloqueio ser concedido.
Exemplos
O exemplo de código seguinte mostra como solicitar um bloqueio de leitor, atualizar o bloqueio de leitor para um bloqueio de escritor e fazer downgrade para bloqueio de leitor novamente.
Este código faz parte de um exemplo mais amplo fornecido para a ReaderWriterLock turma.
// 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
// 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
Observações
Quando um fio chama UpgradeToWriterLock , o bloqueio leitor é libertado, independentemente do número de bloqueios, e o fio vai para o fim da fila para o bloqueio escritor. Assim, outros threads podem escrever no recurso antes de o thread que solicitou a atualização receber o bloqueio de escritor.
Importante
A exceção de time-out não é lançada até que o thread que chamou o UpgradeToWriterLock método possa recuperar o bloqueio do leitor. Se não houver outros tópicos à espera do bloqueio do escritor, isto acontece imediatamente. No entanto, se outro thread for colocado na fila para o bloqueio do escritor, o fio que chamou o UpgradeToWriterLock método não pode voltar a adquirir o bloqueio do leitor até que todos os leitores atuais tenham libertado os seus bloqueios, e um fio tenha adquirido e libertado o bloqueio do escritor. Isto é verdade mesmo que o outro tópico que pediu o bloqueio do escritor o tenha pedido depois do tópico atual chamado o UpgradeToWriterLock método.
Para restaurar o estado de bloqueio, chame DowngradeFromWriterLock usando o LockCookie retorno por UpgradeToWriterLock. Não use isto LockCookie com RestoreLock.
Quando uma thread não tem bloqueio de leitor, não use UpgradeToWriterLock. Utilize AcquireWriterLock em substituição.
Para valores válidos de time-out, veja ReaderWriterLock.
Ver também
- de threading gerenciado
- ReaderWriterLock
Aplica-se a
UpgradeToWriterLock(TimeSpan)
Atualiza um bloqueio de leitor para o bloqueio do escritor, usando um TimeSpan valor para o time-out.
public:
System::Threading::LockCookie UpgradeToWriterLock(TimeSpan timeout);
public System.Threading.LockCookie UpgradeToWriterLock(TimeSpan timeout);
member this.UpgradeToWriterLock : TimeSpan -> System.Threading.LockCookie
Public Function UpgradeToWriterLock (timeout As TimeSpan) As LockCookie
Parâmetros
- timeout
- TimeSpan
A TimeSpan especificação do período de time-out.
Devoluções
Um valor de LockCookie.
Exceções
timeout expira antes de o pedido de bloqueio ser concedido.
timeout especifica um valor negativo diferente de -1 milissegundos.
Observações
Quando um fio chama UpgradeToWriterLock , o bloqueio leitor é libertado, independentemente do número de bloqueios, e o fio vai para o fim da fila para o bloqueio escritor. Assim, outros threads podem escrever no recurso antes de o thread que solicitou a atualização receber o bloqueio de escritor.
Importante
A exceção de time-out não é lançada até que o thread que chamou o UpgradeToWriterLock método possa recuperar o bloqueio do leitor. Se não houver outros tópicos à espera do bloqueio do escritor, isto acontece imediatamente. No entanto, se outro thread for colocado na fila para o bloqueio do escritor, o fio que chamou o UpgradeToWriterLock método não pode voltar a adquirir o bloqueio do leitor até que todos os leitores atuais tenham libertado os seus bloqueios, e um fio tenha adquirido e libertado o bloqueio do escritor. Isto é verdade mesmo que o outro tópico que pediu o bloqueio do escritor o tenha pedido depois do tópico atual chamado o UpgradeToWriterLock método.
Para restaurar o estado de bloqueio, chame DowngradeFromWriterLock usando o LockCookie retorno por UpgradeToWriterLock. Não use isto LockCookie com RestoreLock.
Quando uma thread não tem bloqueio de leitor, não use UpgradeToWriterLock. Utilize AcquireWriterLock em substituição.
Para valores válidos de time-out, veja ReaderWriterLock.
Ver também
- de threading gerenciado
- ReaderWriterLock