c\#신 호 량 과 상호 배척 체 깊이 이해

1.신 호 량(Semaphore)
신 호 량(Semaphore)은 커 널 대상 이 유지 하 는 int 변수 로 신 호 량 이 0 일 때 신 호 량 에서 기다 리 는 스 레 드 가 막 히 고 신 호 량 이 0 보다 많 을 때 막 히 는 것 을 해제 합 니 다.하나의 신 호 량 에서 기다 리 는 스 레 드 가 막 히 면 커 널 은 자동 으로 신 호 량 의 수 를 1 로 줄인다..net 에서 Semaphore 클래스 를 통 해 신 호 량 동기 화 를 실현 합 니 다.
Semaphore 클래스 는 특정한 자원 이나 자원 탱크 에 동시에 접근 할 수 있 는 라인 수 를 제한 합 니 다.WaitOne method,which is inherited from the WaitHandle class,and release the semaphore by calling the Release method.">스 레 드 는 WaitOne 방법 으로 신 호 량 을 1 로 줄 이 고 Release 방법 으로 신 호 량 을 1 로 늘 립 니 다.
먼저 구조 함수:
public Semaphore(int initialCount,int maximumCount);두 개의 매개 변 수 를 통 해 신호 의 초기 계수 와 최대 계 수 를 설정 합 니 다.
다음은 코드 를 통 해 신 호 량 동기 화 사용 을 보 여 줍 니 다.

 class Program
  {
    //         0,     10
    public static Semaphore semaphore =new Semaphore(0,10);
    public static int time = 0;
    static void Main(string[] args)
    {
      for (int i = 0; i < 5; i++)
      {
        Thread test = new Thread(new ParameterizedThreadStart(TestMethod));

        //     ,     
        test.Start(i);
      }

      //   1                
      Thread.Sleep(500);

      //       4
      //              4 
      semaphore.Release(4);
      Console.Read();     
    }

    public static void TestMethod(object number)
    {
      //               
      int span = Interlocked.Add(ref time, 100);
      Thread.Sleep(1000 + span);

      //      1
      semaphore.WaitOne();

      Console.WriteLine("Thread {0} run ", number);
    }
  }
실행 결과:

같은 신 호 량 도 프로 세 스 의 스 레 드 동기 화 를 실현 할 수 있 고 신 호 량 이름 을 통 해 이 루어 집 니 다.
public Semaphore(int initialCount,int maximumCount,string name)호출 하기;이 구조 함 수 는 하나의 신 호 량 명 을 더 전송 하여 실현 한다.
다음 인 스 턴 스 코드 를 보 여 줍 니 다.

using System;
using System.Threading;

namespace SemaphoreSample
{
  class Program
  {
    //         4,     10
    public static Semaphore semaphore =new Semaphore(4,10,"My");
    public static int time = 0;
    static void Main(string[] args)
    {
      for (int i = 0; i < 3; i++)
      {
        Thread test = new Thread(new ParameterizedThreadStart(TestMethod));

        //     ,     
        test.Start(i);
      }

      //   1                
      Thread.Sleep(1000);

      Console.Read();     
    }

    public static void TestMethod(object number)
    {
      //               
      int span = Interlocked.Add(ref time, 500);
      Thread.Sleep(1000 + span);

      //      1
      semaphore.WaitOne();

      Console.WriteLine("Thread {0} run ", number);
    }
  }
}
실행 결과:

실행 결과 에서 알 수 있 듯 이 두 번 째 프로 세 스 값 은 한 줄 의 문 구 를 실 행 했 습 니 다.우리 가 설정 한 초기 신호 수 는 4 이 고 하나의 스 레 드 를 실행 할 때마다 신호 수 는 WaitOne 방법 으로 1 을 줄 였 기 때문에 두 번 째 는 프로 세 스 1 중의 4 가 아 닌 첫 번 째 신호 수 를 1 로 계산 합 니 다.만약 에 우리 가 신호 계수 뒤의 name 매개 변 수 를 제거 하면...이 때 두 번 째 프로 세 스 는 첫 번 째 프로 세 스 의 결과 와 같 아야 합 니 다.
2.상호 배척 체(Mutex)
마찬가지 로 상호 배척 체 도 마찬가지 로 스 레 드 간 의 동기 화 와 서로 다른 프로 세 스 에서 스 레 드 의 동기 화 를 실현 할 수 있다.
먼저 스 레 드 간 의 동기 화 예 를 보 세 요.

 class Program
  {
    public static Mutex mutex = new Mutex();
    public static int count;

    static void Main(string[] args)
    {
      for (int i = 0; i < 10; i++)
      {
        Thread test = new Thread(TestMethod);

        //     ,     
        test.Start();
      }

      Console.Read();
    }

    public static void TestMethod()
    {
      mutex.WaitOne();
      Thread.Sleep(500);
      count++;
      Console.WriteLine("Current Cout Number is {0}", count);
      mutex.ReleaseMutex();
    }
  }
실행 결과:

프로 세 스 간 동기 화 실현:

 class Program
  {
    public static Mutex mutex = new Mutex(false,"My");

    static void Main(string[] args)
    {
      Thread t = new Thread(TestMethod);
      t.Start();

      Console.Read();
    }

    public static void TestMethod()
    {
      mutex.WaitOne();
      Thread.Sleep(5000);
      Console.WriteLine("Method start at : " + DateTime.Now.ToLongTimeString());
      mutex.ReleaseMutex();
    }
  }
실행 결과:

실행 결 과 를 보면 두 프로 세 스 사이 의 시간 간격 이 5 초 인 것 을 알 수 있 습 니 다.구조 함수 에서 이름 을 딴 매개 변 수 를 제거 할 때 차 이 를 알 수 있 습 니 다.
여기까지 다 중 스 레 드 처 리 는 기본적으로 끝 났 습 니 다.이 시 리 즈 는 하나의 입문 일 뿐 입 니 다.정말 다 중 스 레 드 를 잘 파악 해 야 합 니까?아니면 프로젝트 에서 실전 을 많이 해 야 합 니까?그 다음 에 저 는 작은 예 를 들 수 있 습 니 다.대략적인 사 고 는 파일 의 다운 로드 를 실현 하 는 이런 예 입 니 다.만약 에 여러분 들 이 다 중 스 레 드 지식 을 활용 하 는 좋 은 예 가 있다 면 저 에 게 메 시 지 를 남 겨 주 셔 도 됩 니 다.저도 가능 한 한 실현 하 겠 습 니 다.(그렇지 않 으 면 저도 공부 하 게 할 수 있 습 니 다)이 루어 진 후에 여러분 과 공유 하 겠 습 니 다.
이상 은 c\#신 호 량 과 상호 배척 체 의 상세 한 내용 을 깊이 이해 하고 c\#신 호 량 과 상호 배척 체 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기