ReaderWriterLock.UpgradeToWriterLock 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
讀取器鎖定升級至寫入器鎖定。
多載
UpgradeToWriterLock(Int32) |
使用逾時值 Int32,將讀取器鎖定升級至寫入器鎖定。 |
UpgradeToWriterLock(TimeSpan) |
使用逾時值 |
UpgradeToWriterLock(Int32)
使用逾時值 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 。 請勿將此與 搭配 RestoreLock 使用 LockCookie
。
當執行緒沒有讀取器鎖定時,請勿使用 UpgradeToWriterLock
。 請改用 AcquireWriterLock。
如需有效的逾時值,請參閱 ReaderWriterLock 。
另請參閱
適用於
UpgradeToWriterLock(TimeSpan)
使用逾時值 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 。 請勿將此與 搭配 RestoreLock 使用 LockCookie
。
當執行緒沒有讀取器鎖定時,請勿使用 UpgradeToWriterLock
。 請改用 AcquireWriterLock。
如需有效的逾時值,請參閱 ReaderWriterLock 。