한 글 은.Net 이 Threading.Mutex 를 바탕 으로 상호 배척 자 물 쇠 를 실현 하 는 것 을 알 게 해 줍 니 다.

본 고 는 주로.Net 이 Threading.Mutex 를 바탕 으로 상호 배척 자 물 쇠 를 실현 하 는 것 을 설명 한다.
기초 상호 배척 자물쇠 실현
기본 개념:자 회전 자물쇠 와 마찬가지 로 운영 체제 가 제공 하 는 상호 배척 자물쇠 내부 에 자물쇠 가 가 져 왔 는 지 여 부 를 나타 내 는 수치 가 있 습 니 다.다른 것 은 자 물 쇠 를 가 져 오 는 데 실 패 했 을 때 반복 적 으로 재 시도 하지 않 고 스 레 드 를 대기 상태 에 들 어가 게 하 며 스 레 드 대상 을 잠 금 관련 대기 열 에 추가 합 니 다.다른 스 레 드 가 자 물 쇠 를 풀 때 대기 열 에 스 레 드 대상 이 있 는 지 확인 합 니 다.있 으 면 운영 체제 가 이 스 레 드 를 깨 우 는 것 을 알 립 니 다.잠 금 을 가 져 온 스 레 드 대상 이 실행 되 지 않 았 기 때문에 잠 금 을 오래 풀 지 않 아 도 CPU 자원 이 소모 되 지 않 지만 스 레 드 를 대기 상태 로 들 어가 게 하고 대기 상태 에서 깨 우 는 시간 은 자 회전 잠 금 재 시도 의 나 초 급 보다 길 습 니 다.
windows 와 Liux 의 차이
windows 시스템 에서 상호 배척 자 물 쇠 는 CreateMuteEx 함 수 를 통 해 만 들 고 자 물 쇠 를 가 져 올 때 WaitForMultiple ObjectsEx 함 수 를 호출 합 니 다.자 물 쇠 를 풀 면 ReleaseMutex 함 수 를 호출 합 니 다.스 레 드 가 대기 상태 에 들 어가 고 깨 우 는 것 은 시스템 에서 작 동 합 니 다.
Linux 에서 서로 배척 하 는 잠 금 대상 은 NetCore 의 내부 인터페이스 에서 시 뮬 레이 션 하여 이 루어 집 니 다.그 결과 잠 금 상태 값 과 대기 스 레 드 대기 열 을 포함 하고 모든 위탁 관리 스 레 드 는 pthread 와 연 결 됩 니 다.mutex_t 대상 과 pthreadcond_t 대상,이 두 대상 은 pthread 라 이브 러 리 에서 제공 합 니 다.잠 금 실패 스 레 드 를 가 져 오 면 대기 열 pthread 로 가격 을 조정 합 니 다.cond_wait 함수 가 기다 리 고 있 습 니 다.다른 스 레 드 가 잠 금 을 풀 때 대기 열 에 스 레 드 가 있 는 것 을 보면 pthread 를 호출 합 니 다.cond_signal 함수 각성.
기초 상호 배척 잠 금 코드 실현

 public static class MutexDemo
    {
        private static readonly Mutex _lock = new Mutex(false, null);
        private static int _counterA = 0;
        private static int _counterB = 0;

        public static void IncrementCounters()
        {
            //   
            _lock.WaitOne();
            try
            {
                ++_counterA;
                ++_counterB;
            }
            finally
            {
                //   
                _lock.ReleaseMutex();
            }
        }

        public static void GetCounters(out int counterA, out int counterB)
        {
            _lock.WaitOne();
            try
            {
                counterA = _counterA;
                counterB = _counterB;
            }
            finally
            {
                //   
                _lock.ReleaseMutex();
            }
        }


    }

상호 배척 자물쇠(재 귀 자물쇠)
기본 개념:Mutex 가 제공 하 는 자 물 쇠 는 다시 들 어 갈 수 있 습 니 다.자 물 쇠 를 가 져 온 스 레 드 는 자 물 쇠 를 가 져 오 는 작업 을 다시 수행 할 수 있 지만 자 물 쇠 를 풀 어 주 는 작업 도 같은 횟수 를 실행 해 야 합 니 다.다시 들 어 갈 수 있 는 자 물 쇠 는 재 귀 자물쇠 라 고도 합 니 다.
실현 원리:재 귀 잠 금 내부 에서 하나의 계수 기 를 사용 하여 진입 횟수 를 기록 하고 같은 스 레 드 는 가 져 올 때마다 1 을 추가 하 며 한 번 풀 면 1 을 줄 이 고 1 을 줄 인 후에 계산기 가 0 이면 진정한 방출 작업 을 수행 합 니 다.재 귀 잠 금 은 하나의 함수 에서 사용 하 는 것 은 의미 가 없 으 며,일반적으로 여러 함수 에 포함 되 어 있다.
코드 구현

public static class MutexRecursionDemo
    {
        private static Mutex _lock = new Mutex(false, null);
        private static int _counterA = 0;
        private static int _counterB = 0;

        public static void IncrementCountersA()
        {
            //   
            _lock.WaitOne();
            try
            {
                ++_counterA;
            }
            finally
            {
                //   
                _lock.ReleaseMutex();
            }
        }

        public static void IncrementCountersB()
        {
            //   
            _lock.WaitOne();
            try
            {
                ++_counterB;
            }
            finally
            {
                //   
                _lock.ReleaseMutex();
            }
        }

        public static void IncrementCounters()
        {
            //   
            _lock.WaitOne();
            try
            {
                IncrementCountersA();
                IncrementCountersB();
            }
            finally
            {
                //   
                _lock.ReleaseMutex();
            }
        }


        public static void GetCounters(out int counterA, out int counterB)
        {
            _lock.WaitOne();
            try
            {
                counterA = _counterA;
                counterB = _counterB;
            }
            finally
            {
                //   
                _lock.ReleaseMutex();
            }
        }
    }

상호 배척 잠 금(크로스 프로 세 스 사용)
기본 개념:Mutex 는 프로 세 스 칭찬 을 지원 합 니 다.생 성 은 구조 함수 의 두 번 째 매개 변수 name 을 통 해 이름 을 입력 합 니 다.이름 은 Walterlv.Mutex 로 시작 할 때 같은 사용자 의 프로 세 스 가 이 이름 을 가 진 자 물 쇠 를 공유 합 니 다.한 프로 세 스에 서 자 물 쇠 를 가 져 오 면 이 자 물 쇠 를 풀 기 전에 다른 프로 세 스 가 같은 이름 의 자 물 쇠 를 가 져 오 려 면 기 다 려 야 합 니 다.프로 세 스 가 자 물 쇠 를 가 져 오 면,그러나 종료 하기 전에 자 물 쇠 를 풀 방법 이 호출 되 지 않 으 면 자 물 쇠 는 자동 으로 풀 리 고 현재 자 물 쇠 를 기다 리 고 있 는 다른 경성 은 Abandoned Mute Exception 이상 을 받 습 니 다.
링크 ux 구현 방식 은 임시 파일 을 통 해 이 루어 집 니 다.
구현 코드

public static class MutexDemo
    {
        private static Mutex _lock = new Mutex(false, @"Walterlv.Mutex");
        private static int _counterA = 0;
        private static int _counterB = 0;

        public static void IncrementCounters()
        {
            //   
            _lock.WaitOne();
            try
            {
                ++_counterA;
                ++_counterB;
            }
            finally
            {
                //   
                _lock.ReleaseMutex();
            }
        }

        public static void GetCounters(out int counterA, out int counterB)
        {
            _lock.WaitOne();
            try
            {
                counterA = _counterA;
                counterB = _counterB;
            }
            finally
            {
                //   
                _lock.ReleaseMutex();
            }
        }
    }

이 코드 는 한 부 만 복사 하면 여러 프로그램 에서 시작 되 며,Mutex Demo.Increment Counters()를 호출 하면 효 과 를 볼 수 있 습 니 다.
이 글 에 대해 알 아 보 겠 습 니 다.Net 은 Threading.Mutex 를 바탕 으로 상호 배척 자 물 쇠 를 실현 하 는 글 을 소개 합 니 다.더 많은 관련 이 있 습 니 다.Net 상호 배척 자 물 쇠 는 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기