베이스 스레드 동기식 패브릭 Mutes(상호 배타적)

14553 단어 스레드 동기화
상호 배척체는 상호 배척 (mutual exclusion) 동기화의 간단한 형식을 실현했다.
상호 배척체는 보호된 코드 "임계 구역"(critical section)에 여러 스레드가 동시에 들어가는 것을 금지합니다.
따라서 임의의 시간에 하나의 라인만 이러한 코드 보호 구역에 들어갈 수 있다.모든 라인이 임계 구역 에 들어가기 전에 (acquire) 이 구역과 관련된 상호 배척체의 소유권을 가져야 합니다.만약 이미 다른 라인이 임계 구역의 상호 배척체를 가지고 있다면 다른 라인은 더 이상 그 안에 들어갈 수 없다.이 라인들은 현재 속 주 스레드 이 서로 밀어낼 때까지 기다려야 한다.언제 상호 배척체를 사용해야 합니까?상호 배척체는 공유된 변환 코드, 즉 전역 또는 정적 데이터를 보호하는 데 사용된다.이러한 데이터는 여러 라인이 동시에 접근할 때 손상되지 않도록 상호 배척체를 통해 보호해야 한다.
상호 배척체 (mutex) 는 상호 배척된 자물쇠를 대표한다.그것의 작업 방식은 AutoReset Event (또는 계수가 1인 Semaphore) 와 비슷하다. 이 세 가지 구조는 한 번에 대기 중인 라인만 방출하고, mutex를 실례화할 때, 기본적으로 대기 중인 라인을 방출한다. 이것은 new AutoReset Event (true) 를 초기화하는 것과 유사하다.다음은 Mutex 클래스의 모습입니다.
 
  public sealed class Mutex:WaitHandle{

       public Mutex();

       public void ReleaseMutex();

    }

 
상호 배척체는 일부 이외의 논리가 안에 있는데, 이것은 그것들이 다른 구조보다 더욱 복잡하게 만든다.우선, Mutex 대상은 호출된 라인의 Int32ID를 조회하고, 그 라인이 그를 얻었다는 것을 기록한다.하나의 라인이 ReleaseMutex를 호출할 때, Mutex는 호출 라인이 Mutex를 가져오는 라인인지 확인합니다.그렇지 않으면, Mutex 대상의 상태는 바뀌지 않고, Release Mutex는 시스템을 던집니다.ApplicationException.이외에, 만약 Mutex를 가진 라인이 작업 때문에 종료된다면, 하나의 Mutex에서 기다리는 라인은 하나의 시스템이 던져졌기 때문이다.Threading.AbandonedMutexException 예외로 깨어났습니다.보통 이 이상은 처리되지 않은 이상이 되어 전체 라인을 종료합니다.이것은 좋은 일이다. 왜냐하면 하나의 라인이 Mutex를 얻은 후에 Mutex가 보호한 데이터를 업데이트하기 전에 종료될 수 있기 때문이다.Abandoned Mutex Exception 스레드가 포착되면 손상된 데이터에 접근하려고 시도할 수 있으며, 예측할 수 없는 결과와 안전 문제를 초래할 수 있습니다.
그 다음으로, Mutex 대상은 이 mutex를 가진 라인이 얼마나 많은 라인을 가지고 있는지 가리키는 귀속 계수를 유지하고 있다.현재 하나의 스레드에 하나의 Mutex가 있고 그 스레드가 다시 Mutex에서 기다리면 귀속 계수가 증가합니다. 이 스레드는 계속 실행할 수 있습니다.스레드가 ReleaseMutex를 호출하면 반복 수가 감소합니다.귀속계수가 0이 될 때만 다른 라인이 이mutex의 소유자가 될 수 있습니다.
대다수의 사람들은 이 추가적인 논리를 좋아하지 않는다.이러한'기능'은 대가를 치러야 한다.Mutex 객체에는 추가 스레드 ID 및 반복 계수 정보를 저장할 메모리가 더 필요합니다.더 중요한 것은 Mutex 코드가 이 정보를 유지해야 하기 때문에 자물쇠가 더 느려져야 한다는 것이다.만약에 한 응용 프로그램이 이러한 이외의 기능을 필요로 한다면 응용 프로그램의 코드는 스스로 실현할 수 있다.코드를 굳이 Mutext 객체에 넣을 필요는 없습니다.따라서 많은 사람들이 Mutex 객체를 사용하지 않습니다.
두 개 이상의 라인이 공유 자원을 동시에 방문해야 할 때 시스템은 동기화 메커니즘을 사용하여 한 번에 한 라인만 이 자원을 사용할 수 있도록 확보해야 한다.Mutex는 동기화 기원으로 공유 자원에 대한 단독 접근권을 한 라인에만 부여합니다.만약 한 라인이 상호 배척체를 얻었다면, 상호 배척체를 얻으려면 두 번째 라인이 걸려 있고, 첫 번째 라인이 상호 배척체를 방출하는 것을 알 수 있습니다.
WaitHandle을 사용할 수 있습니다.WaitOne 메서드는 상호 배척체의 소속권을 요청합니다.상호 배척체가 있는 라인은 WaitOne의 중복 호출에서 같은 상호 배척체를 요청할 수 있으며 실행을 막지 않습니다.그러나 스레드는 상호 배척체의 소속권을 방출하기 위해 ReleaseMutex 방법을 같은 횟수로 호출해야 한다.Mutex 클래스는 스레드 식별을 강제하기 때문에 상호 배척체는 그 스레드를 받아서만 방출할 수 있습니다.반대로 Semaphore 클래스는 스레드 표식을 강제하지 않습니다.
만약 라인이 상호 배척체를 가지고 있는 것이 종료된다면, 이 상호 배척체는 포기된다고 한다.이mutex의 상태를 신호를 받는 것으로 설정하면 다음 대기 라인이 소유권을 가져옵니다.에서net FrameWork 2.0 버전을 시작합니다. 포기된 mutex의 다음 라인을 가져오면 Abandoned Mutex Exception이 발생합니다.에 있습니다.net Framework 2.0 버전 이전에 어떠한 이상도 일으키지 않습니다.
경고: 취소된 Mutex가 나타나면 코드에 심각한 오류가 있음을 나타냅니다.만약 어떤 라인이 호환체를 방출하지 않았을 때 종료한다면, 이 호환체로 보호된 데이터 구조는 일치하지 않는 상태에 있을 수 있습니다.만약 이 데이터 구조의 완전한 성능이 검증된다면, 다음 호출체 소속권을 요청하는 라인은 이 이상을 처리하고 계속할 수 있습니다.
시스템 범위의mutex에 대해 포기된mutex는 프로그램이 갑자기 종료되었음을 지시할 수 있습니다. (예를 들어 윈도우즈 작업 관리자를 사용하여 종료됨)
Mutex에는 이름이 없는 부분적 mutex와 이름이 지정된 시스템 mutex 두 가지 유형이 있습니다.로컬 mutex는 프로세스에만 존재합니다.프로세스에서 mutex를 나타내는 Mutex 객체의 아래 이름을 참조하여 사용할 수 있습니다.이름이 없는 모든 mutex 대상은 단독 부분적인 mutex를 표시합니다.
이름이 지정된 시스템 상호 배타체는 전체 운영 체제에서 볼 수 있으며 동기화 프로세스 활동에 사용할 수 있습니다.이름이 적용된 구조 함수를 사용하여 이름이 지정된 시스템 mutex를 나타내는 Mutex 객체를 만들 수 있습니다.운영체제 대상을 만들 수도 있고, 창첩mutex 대상을 만들기 전에 존재할 수도 있습니다.동일한 명명 시스템 Mutex를 나타내기 위해 여러 개의 Mutex 객체를 만들 수 있으며 OpenExisting 방법을 사용하여 기존 명명 시스템 mutex를 열 수 있습니다.
설명: 터미널 서비스를 실행하는 서버에서 이름이 붙은 시스템mutex는 두 개의 가시성을 가진다.이름이 "Global\"이라는 접두어로 시작되면 mutex는 모든 터미널 서버 세션에 표시됩니다.이름이 "Local\"이라는 접두어로 시작되면 mutex는 해당 이름을 만든 터미널 서버 세션에서만 표시됩니다.이 경우 서버의 다른 터미널 서버 세션에는 이름이 같은 독립된 mutex가 있을 수 있습니다.이름이 지정된 mutex를 만들 때 접두사를 지정하지 않으면 "Local\"접두사가 사용됩니다.터미널 서버 세션에서 이름 접두사만 다른 두 개의 무텍스는 독립된 무텍스입니다. 이 두 개의 무텍스는 터미널 서버 세션의 모든 프로세스를 볼 수 있습니다.즉, 접두사 이름 "Global\"과 "Local\"은 mutex 이름이 프로세스가 아닌 터미널 서버 세션에 상대적인 범위임을 나타냅니다.
설명: 이 유형 또는 구성원에 적용되는 HostProtectionAttribute 특성에는 다음과 같은 속성 값이 있습니다: Synchronization | External Threading.Resources 데스크톱 응용 프로그램에는 영향을 주지 않습니다(일반적으로 아이콘을 두 번 클릭하거나 명령을 입력하거나 브라우저에 URL을 입력하여 이 응용 프로그램을 시작합니다).자세한 내용은 클래스 또는 HostProtectionAttribute를 참조하십시오.
예: 로컬 Mutex 객체를 사용하여 보호된 리소스에 대한 액세스를 동기화하는 방법을 보여 줍니다.
  
// This example shows how a Mutex is used to synchronize access

// to a protected resource. Unlike Monitor, Mutex can be used with

// WaitHandle.WaitAll and WaitAny, and can be passed across

// AppDomain boundaries.



using System;

using System.Threading;



class Test

{

    // Create a new Mutex. The creating thread does not own the

    // Mutex.      Mutex ,                .Mutex  WaitOne ,      ,       :new AutoResetEvent(true).

    private static Mutex mut = new Mutex();

    private const int numIterations = 1;

    private const int numThreads = 3;



    static void Main()

    {

        // Create the threads that will use the protected resource.

        for(int i = 0; i < numThreads; i++)

        {

            Thread myThread = new Thread(new ThreadStart(MyThreadProc));

            myThread.Name = String.Format("Thread{0}", i + 1);

            myThread.Start();

        }



        // The main thread exits, but the application continues to

        // run until all foreground threads have exited.

    }



    private static void MyThreadProc()

    {

        for(int i = 0; i < numIterations; i++)

        {

            UseResource();

        }

    }



    // This method represents a resource that must be synchronized

    // so that only one thread at a time can enter.

    private static void UseResource()

    {

        // Wait until it is safe to enter.

        mut.WaitOne();



        Console.WriteLine("{0} has entered the protected area", 

            Thread.CurrentThread.Name);



        // Place code to access non-reentrant resources here.



        // Simulate some work.

        Thread.Sleep(500);



        Console.WriteLine("{0} is leaving the protected area\r
", Thread.CurrentThread.Name); // Release the Mutex. mut.ReleaseMutex(); } }

이것은 MSDN의 학습 소감을 참고한 것이다...HostProtectionAttribute

좋은 웹페이지 즐겨찾기