이 설명서는 보관되지만 유지 되지 않습니다.

ReaderWriterLock.WriterSeqNum 속성

업데이트: 2007년 11월

현재 시퀀스 번호를 가져옵니다.

네임스페이스:  System.Threading
어셈블리:  mscorlib(mscorlib.dll)

public int WriterSeqNum { get; }
/** @property */
public int get_WriterSeqNum()

public function get WriterSeqNum () : int

속성 값

형식: System.Int32

현재 시퀀스 번호입니다.

스레드가 판독기 잠금을 가져올 때마다 시퀀스 번호가 증가합니다. 다른 스레드에서 작성기 잠금을 가져왔는지 여부를 확인하려는 경우 시퀀스 번호를 저장한 다음 나중에 AnyWritersSince에 전달할 수 있습니다.

WriterSeqNum을 사용하면 응용 프로그램 성능을 향상시킬 수 있습니다. 예를 들어, 스레드는 판독기 잠금을 보유하는 동안 가져온 정보를 캐시할 수 있습니다. 잠금을 해제한 다음 나중에 다시 가져온 경우 스레드는 AnyWritersSince를 호출하여 다른 스레드가 해당 리소스에 썼는지 여부를 확인할 수 있으며, 그렇지 않은 경우 캐시된 정보를 사용할 수 있습니다. 이 방법은 데이터베이스 쿼리를 실행하는 경우처럼 잠금에 의해 보호된 정보를 읽는 데 비용이 많이 소요될 경우에 유용합니다.

시퀀스 번호를 유용하게 사용하려면 호출자가 판독기 잠금 또는 작성기 잠금을 보유하고 있어야 합니다.

다음 코드 예제에서는 WriterSeqNum 속성 및 AnyWritersSince 메서드를 사용하여 현재 스레드가 작성기 잠금을 마지막으로 보유한 이후 다른 스레드가 보호된 리소스에 대한 작성기 잠금을 가져왔는지 확인하는 방법을 보여 줍니다.

이 코드는 ReaderWriterLock 클래스에 대해 제공되는 보다 큰 예제의 일부입니다.

// The complete code is located in the ReaderWriterLock
// class topic.
using System;
using System.Threading;

public class Test
{
    // Declaring the ReaderWriterLock at the class level
    // makes it visible to all threads.
    static ReaderWriterLock rwl = new ReaderWriterLock();
    // For this example, the shared resource protected by the
    // ReaderWriterLock is just an integer.
    static int resource = 0;


...


// Shows how to release all locks and later restore
// the lock state. Shows how to use sequence numbers
// to determine whether another thread has obtained
// a writer lock since this thread last accessed the
// resource.
static void ReleaseRestore(int timeOut)
{
    int lastWriter;

    try
    {
        rwl.AcquireReaderLock(timeOut);
        try
        {
            // It is safe for this thread to read from
            // the shared resource. Cache the value. (You
            // might do this if reading the resource is
            // an expensive operation.)
            int resourceValue = resource;
            Display("reads resource value " + resourceValue); 
            Interlocked.Increment(ref reads);

            // Save the current writer sequence number.
            lastWriter = rwl.WriterSeqNum;

            // Release the lock, and save a cookie so the
            // lock can be restored later.
            LockCookie lc = rwl.ReleaseLock();

            // Wait for a random interval (up to a 
            // quarter of a second), and then restore
            // the previous state of the lock. Note that
            // there is no time-out on the Restore method.
            Thread.Sleep(rnd.Next(250));
            rwl.RestoreLock(ref lc);

            // Check whether other threads obtained the
            // writer lock in the interval. If not, then
            // the cached value of the resource is still
            // valid.
            if (rwl.AnyWritersSince(lastWriter))
            {
                resourceValue = resource;
                Interlocked.Increment(ref reads);
                Display("resource has changed " + resourceValue);
            }
            else
            {
                Display("resource has not changed " + resourceValue);
            }
        }        
        finally
        {
            // Ensure that the lock is released.
            rwl.ReleaseReaderLock();
        }
    }
    catch (ApplicationException)
    {
        // The reader lock request timed out.
        Interlocked.Increment(ref readerTimeouts);
    }
}


...


}


// The complete code is located in the ReaderWriterLock
// class topic.
import System.*;
import System.Threading.*;
import System.Threading.Thread;    

public class Test
{
    // Declaring the ReaderWriterLock at the class level
    // makes it visible to all threads.
    private static ReaderWriterLock rwl = new ReaderWriterLock();

    // For this example, the shared resource protected by the
    // ReaderWriterLock is just an integer.
    private static int resource = 0;


...



// Shows how to release all locks and later restore
// the lock state. Shows how to use sequence numbers
// to determine whether another thread has obtained
// a writer lock since this thread last accessed the
// resource.
static void ReleaseRestore(int timeOut)
{
    int lastWriter;

    try {
        rwl.AcquireReaderLock(timeOut);
        try {
            // It is safe for this thread to read from
            // the shared resource. Cache the value. (You
            // might do this if reading the resource is
            // an expensive operation.)
            int resourceValue = resource;

            Display(("reads resource value " + resourceValue));
            Interlocked.Increment(reads);

            // Save the current writer sequence number.
            lastWriter = rwl.get_WriterSeqNum();

            // Release the lock, and save a cookie so the
            // lock can be restored later.
            LockCookie lc = rwl.ReleaseLock();

            // Wait for a random interval (up to a 
            // quarter of a second), and then restore
            // the previous state of the lock. Note that
            // there is no time-out on the Restore method.
            Thread.Sleep(rnd.Next(250));
            rwl.RestoreLock(lc);

            // Check whether other threads obtained the
            // writer lock in the interval. If not, then
            // the cached value of the resource is still
            // valid.
            if (rwl.AnyWritersSince(lastWriter)) {
                resourceValue = resource;
                Interlocked.Increment(reads);
                Display(("resource has changed " + resourceValue));
            }
            else {
                Display(("resource has not changed " + resourceValue));
            }
        }
        finally {
            // Ensure that the lock is released.
            rwl.ReleaseReaderLock();
        }
    }
    catch (ApplicationException exp) {
        // The reader lock request timed out.
        Interlocked.Increment(readerTimeouts);
    }
} //ReleaseRestore


...


}


Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98

.NET Framework 및 .NET Compact Framework에서 모든 플랫폼의 전체 버전을 지원하지는 않습니다. 지원되는 버전의 목록을 보려면 .NET Framework 시스템 요구 사항을 참조하십시오.

.NET Framework

3.5, 3.0, 2.0, 1.1, 1.0에서 지원
표시: