C\#다 중 스 레 드 기초 지식 집합

최근 에 스스로 작은 파충류 라 고 썼 는데 그 안에 다 중 스 레 드 기술 이 사용 되 었 는데 갑자기 이 기술 이 낯 설 다 는 것 을 알 게 되 었 다.그래서 미 친 듯 이 도 모 에 게 물 어보 기 시 작 했 고 여기 서 자신 과 친구 들 이 공부 할 수 있 도록 기록 했다.
뭐 공부 해요?
하나의 프로그램 은 하나의 프로 세 스 에 해당 합 니 다.프로 세 스 는 프로그램의 모든 자원 프로 세 스 를 가지 고 있 습 니 다.프로 세 스 의 자원 은 스 레 드 로 공유 되 지만 스 레 드 가 없습니다.우 리 는 컴퓨터 의 작업 관리 자 를 열 수 있 습 니 다.실행 되 는.exe 는 모두 프로 세 스 이 고 그 안의 가 지 는 스 레 드 입 니 다.
다 중 스 레 드
다 중 스 레 드 는 사실 프로 세 스 의 병렬 실행 코드 입 니 다.
1.스 레 드 생 성 및 시작

static void Main()
    {
      //    Id
      var threadId = Thread.CurrentThread.ManagedThreadId;
      var thread = new Thread(Test1);
      thread.Start();

      Console.WriteLine(threadId + "_Main()");
      Console.Read();
    }

    /// <summary>
    ///     
    /// </summary>
    private static void Test1()
    {
      //    Id
      var threadId = Thread.CurrentThread.ManagedThreadId;
      Console.WriteLine(threadId + "_Test()");
      for (int i = 0; i < 10; i++)
      {
        Console.WriteLine(threadId + "_" + i);
      }
    }

결과:
2.임시 스 레 드 노 간 시간

static void Main()
    {
      //    Id
      var threadId = Thread.CurrentThread.ManagedThreadId;
      var thread = new Thread(Test1);
      thread.Start();
      Console.WriteLine($"   Id{threadId}_Main()");
      Console.Read();
    }

    /// <summary>
    ///     
    /// </summary>
    private static void Test1()
    {
      //    Id
      var threadId = Thread.CurrentThread.ManagedThreadId;
      Console.WriteLine($"   Id{threadId}_Test()");
      for (int i = 0; i < 10; i++)
      {
        Thread.Sleep(1000);//    
        Console.WriteLine($"   Id{threadId}_{DateTime.Now}");
      }
    }
결과:

3.스 레 드 통합
Thread.Join 작업 은 현재 스 레 드 를 막 고 하위 스 레 드 가 완 료 된 후에 실 행 됩 니 다.

static void Main()
    {
      //    Id
      var threadId = Thread.CurrentThread.ManagedThreadId;
      var thread = new Thread(Test1);
      thread.Start();
      Console.WriteLine($"   Id{threadId}_Main()1");
      thread.Join();
      Console.WriteLine($"   Id{threadId}_Main()2");
      Console.Read();
    }

    /// <summary>
    ///     
    /// </summary>
    private static void Test1()
    {
      //    Id
      var threadId = Thread.CurrentThread.ManagedThreadId;
      Console.WriteLine($"   Id{threadId}_Test()");
      for (int i = 0; i < 10; i++)
      {
        Thread.Sleep(1000);//    
        Console.WriteLine($"   Id{threadId}_{DateTime.Now}");
      }
    }
결과:

4.스 레 드 종료

static void Main()
    {
      //    Id
      var threadId = Thread.CurrentThread.ManagedThreadId;
      var thread = new Thread(Test1);
      thread.Start();
      Console.WriteLine($"   Id{threadId}_Main()1");
      Thread.Sleep(3000);
      thread.Abort();
      Console.WriteLine($"   Id{threadId}_Main()2");
      Console.Read();
    }

    /// <summary>
    ///     
    /// </summary>
    private static void Test1()
    {
      //    Id
      var threadId = Thread.CurrentThread.ManagedThreadId;
      Console.WriteLine($"   Id{threadId}_Test()");
      for (int i = 0; i < 10; i++)
      {
        Thread.Sleep(1000);//    
        Console.WriteLine($"   Id{threadId}_{DateTime.Now}");
      }
    }
결과:

 5.스 레 드 의 매개 변수 전달

static void Main()
    {
      //    Id
      var threadId = Thread.CurrentThread.ManagedThreadId;
      Console.WriteLine($"   Id{threadId}_Main()");
      //         
      var thread1 = new Thread(() => Test1("   "));
      thread1.Start();

      //         (       ,object  )
      var parameterizedThreadStart = new ParameterizedThreadStart(Test2);
      var thread2 = new Thread(parameterizedThreadStart);
      thread2.Start("   ");
      Console.Read();
    }

    /// <summary>
    ///     
    /// </summary>
    private static void Test1(string name)
    {
      //    Id
      var threadId = Thread.CurrentThread.ManagedThreadId;
      Console.WriteLine($"   Id{threadId}_     :{name}");
    }

    /// <summary>
    ///     
    /// </summary>
    private static void Test2(object name)
    {
      //    Id
      var threadId = Thread.CurrentThread.ManagedThreadId;
      Console.WriteLine($"   Id{threadId}_     :{name}");
    }
결과:

다른 전달 방식 도 있 습 니 다.여기 서 는 설명 을 하지 않 고 Thread 가 제공 하 는 몇 가지 만 소개 합 니 다.
6.스 레 드 안전 과 스 레 드 잠 금 Lock
스 레 드 안전 은 다 중 스 레 드 에 접근 할 때 잠 금 체 제 를 사용 합 니 다.한 스 레 드 가 이러한 데이터 에 접근 할 때 보 호 를 합 니 다.다른 스 레 드 는 이 스 레 드 가 다 읽 을 때 까지 접근 할 수 없습니다.다른 스 레 드 는 사용 할 수 있 습 니 다.스 레 드 안전 상황 에서 데이터 가 일치 하지 않 거나 데이터 오염 문제 가 발생 하지 않 습 니 다.스 레 드 가 안전 하지 않 은 것 은 데이터 접근 보 호 를 제공 하지 않 는 것 입 니 다.여러 스 레 드 가 연이어 데 이 터 를 변경 하여 얻 은 데 이 터 는 더러 운 데이터 입 니 다!모든 스 레 드 에서 전체 변수,정적 변 수 는 읽 기 동작 만 있 고 쓰기 동작 이 없 으 면 일반적으로 이 전체 변 수 는 스 레 드 가 안전 합 니 다.여러 개의 스 레 드 가 동시에 쓰기 작업 을 수행 하려 면 스 레 드 동기 화 를 고려 해 야 합 니 다.그렇지 않 으 면 스 레 드 안전 에 영향 을 줄 수 있 습 니 다.
lock 키 워드 는 지정 한 대상 의 상호 배척 자 물 쇠 를 가 져 와 서 어구 블록 을 임계 구역 으로 표시 하고 실행 문 구 를 풀 어 줍 니 다.
lock 은 코드 의 임계 구역 에 스 레 드 가 있 을 때 다른 스 레 드 가 임계 구역 에 들 어가 지 않도록 합 니 다.다른 스 레 드 가 잠 긴 코드 에 들 어 가 려 고 하면 대상 이 풀 릴 때 까지 기다 릴 것 입 니 다.Lock 을 사용 하면 전체 응용 프로그램의 직렬 화 를 초래 하고 프로그램의 병행 능력 을 낮 추 며 성능 에 영향 을 줄 수 있 습 니 다.
도대체 어떤 장면 에서 lock 을 사용 하여 스 레 드 안전 을 확보 해 야 합 니까?이 직렬 은 직렬 이 고 병행 해 야 합 니 다.
잠 금 추가 전:

public static int i = 1000000;
    static void Main()
    {
      //    Id
      var threadId = Thread.CurrentThread.ManagedThreadId;
      for (int j = 0; j < 2; j++)
      {
        var thread = new Thread(Test1);
        thread.Start();
      }
      Console.Read();
    }

    /// <summary>
    ///     
    /// </summary>
    private static void Test1()
    {
      //    Id
      var threadId = Thread.CurrentThread.ManagedThreadId;

      Console.WriteLine($"   Id{threadId}_i   :{i}");
      int count = 0;
      for (int j = 0; j < 1000000; j++)
      {
        i--;
        count++;
      }
      Console.WriteLine($"   Id{threadId}_    :{count}");
      Console.WriteLine($"   Id{threadId}_i   :{i}");
    }
결과:

잠 금 추가 후:

public static int i = 1000000;
    private readonly static object objLock = new object();
    static void Main()
    {
      //    Id
      var threadId = Thread.CurrentThread.ManagedThreadId;
      for (int j = 0; j < 2; j++)
      {
        var thread = new Thread(Test1);
        thread.Start();
      }
      Console.Read();
    }

    private static void Test1()
    {
      //    Id
      var threadId = Thread.CurrentThread.ManagedThreadId;

      int count = 0;
      lock (objLock)
      {
        Console.WriteLine($"   Id{threadId}_i   :{i}");
        for (int j = 0; j < 1000000; j++)
        {
          i--;
          count++;
        }
      }
      Console.WriteLine($"   Id{threadId}_    :{count}");
      Console.WriteLine($"   Id{threadId}_i   :{i}");
    }
결과:

자,오늘 스 레 드 에 관 한 지식 은 여기까지 나 눠 드 리 겠 습 니 다.
C\#다 중 스 레 드 기초 지식 을 모 은 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C\#다 중 스 레 드 기초 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기