C#다중 스레드 관행-스레드 동기화

4988 단어 스레드 동기화
아래의 표는 늘어섰다.NET에서 스레드 동작을 조정하거나 동기화하는 데 사용할 수 있는 도구:
간편한 차단 방법
구성
의 목적
Sleep
주어진 시간 주기 차단
Join
다른 라인이 완성되기를 기다리다
자물쇠 시스템
구성
의 목적
프로세스 간?
스피드
lock
자원이나 코드에 한 라인만 접근할 수 있는지 확인하십시오.
아니요
빨리
Mutex
자원이나 코드에 한 라인만 접근할 수 있는지 확인하십시오.한 프로그램의 여러 사례가 동시에 실행되는 것을 방지하는 데 사용할 수 있습니다.
예.
중등
Semaphore
지정한 수를 초과하지 않는 라인이 어떤 자원이나 코드에 접근하지 않도록 하십시오.
예.
중등
 
신호 시스템
구성
의 목적
프로세스 간?
스피드
EventWaitHandle
다른 라인이 신호를 보낼 때까지 기다릴 수 있습니다.
예.
중등
Wait 및 Pulse*
사용자 정의 차단 조건이 충족될 때까지 라인을 기다릴 수 있습니다.
아니요
중등
 
동기화 요령
차단
한 라인이 위에서 열거한 방식을 통해 기다리거나 멈추는 상태에 있으면 막는 것으로 불린다.일단 막히면, 스레드는 분배된 CPU 시간을 즉시 포기하고, 스레드의 ThreadState 속성을 WaitSleepJoin 상태로 추가하여, 차단이 정지될 때까지 합니다.중지 차단은 다음 조건 중 하나에 의해 트리거되지 않습니다.
  • 차단 조건이 충족되었습니다
  • 작업 시간 초과 (timeout이 지정된 경우)
  • Thread를 통해Interrupt가 중단됨
  • Thread를 통해Abort 포기
  • 스레드가 (Suspend 방법을 통과하는 것을 권장하지 않음) 멈추면, 막혔다고 생각하지 않습니다.
    절전 모드 및 폴링
    Thread 호출.Sleep은 현재 스레드가 지정된 시간(또는 중단될 때까지)을 차단합니다.
    static void Main() {
    
        Thread.Sleep (0);                           //   CPU   
    
        Thread.Sleep (1000);                        //   1000  
    
        Thread.Sleep (TimeSpan.FromHours (1));      //   1  
    
        Thread.Sleep (Timeout.Infinite);            //       
    
    }

    정확히 말하면, Thread.Sleep은 CPU 사용을 포기하고 요청이 지정된 시간을 초과할 때까지 더 이상 분배되지 않습니다.Thread.Sleep(0) CPU를 포기하는 시간은 타임슬립 대기열에서 활동하는 다른 라인이 실행될 때까지 충분합니다.
         Thread.Sleep은 차단 방법 중 유일하게 윈도 포획 프로그램의 윈도 메시지를 정지하는 방법으로 윈도 포획 프로그램에서 매우 큰 문제이며, 주 UI 스레드에 대한 차단은 프로그램에 상응하는 것을 잃게 할 것이다.따라서 일반적으로 이렇게 사용하는 것을 피한다. 정보 획득이 기술적으로 잠정적으로 이루어졌든 그렇지 않든.스레드 클래스는 CPU 시간을 포기하지 않고, 주어진 교체 횟수를 '쓸데없이 바쁘다' 고 유지하는 SpinWait 방법을 제공한다.50번 교체는 보통 CPU의 속도와 부하에 따라 1초 정도 멈춘다.기술적으로 말하자면 SpinWait는 막는 방법이 아니다. spin-waiting에 있는 스레드의 ThreadState는 WaitSleepJoin 상태가 아니며 다른 스레드에 의해 너무 일찍 중단되지 않는다. (Interrupt)SpinWait은 매우 적게 사용되는데, 그 역할은 아주 짧은 시간 (1초 미만일 수도 있음) 내에 준비할 수 있는 예상 가능한 자원을 기다리는 것이다. Sleep 방법을 사용해서 라인을 막지 않고 CPU 시간을 낭비하는 것이다.그러나 이런 기술의 장점은 멀티프로세서 컴퓨터에 있다. 단일 프로세서의 컴퓨터에 대해 윤문하는 라인이 타임슬립을 끝내기 전까지 한 자원이 상태를 바꿀 기회가 없다. 이것은 그의 취지에 어긋난다.또한 SpinWait을 호출하는 데 시간이 오래 걸리는 것 자체가 CPU 시간을 낭비하는 것이다.
    차단 vs. 폴링
    스레드는 확인된 조건을 기다리면서 폴링 방식을 명시적으로 사용할 수 있습니다. 예를 들어 다음과 같습니다.
    while (!proceed);

    또는
    while (DateTime.Now < nextStartTime);

    이것은 CPU 시간을 매우 낭비한다. CLR과 운영체제에 있어 라인은 중요한 계산을 하기 때문에 해당하는 자원을 분배했다!이런 상태에서.
    아래의 퀴즈 라인은 막는 것이 아니라, 한 라인이 이벤트WaitHandle을 기다리는 것과 같지 않다.
    차단 및 폴링 조합을 사용하면 몇 가지 변환이 발생할 수 있습니다.
    while (!proceed) Thread.Sleep (x); // "    !"

    x가 클수록 CPU 효율이 높아지고 절충 방안은 잠복 시간을 늘리는 것이며, 순환 중의 조건이 매우 복잡하지 않으면 어떠한 20ms의 비용도 보잘것없다.
    약간의 지연을 제외하고는 이런 윤문과 휴면 방식이 매우 잘 결합될 수 있다. 아마도 가장 큰 용도는 프로그래머가 복잡한 신호 구조를 사용하는 것을 포기하고 일을 할 수 있다는 데 있을 것이다.
    Join을 사용하여 스레드가 완료될 때까지 대기
    Join 방법을 사용하여 다른 스레드가 끝날 때까지 스레드를 차단할 수 있습니다.
    class ThreadDemo {
    
     
    
        static void Main() {
    
     
    
        Thread t = new Thread (delegate() { Console.ReadLine();});
    
     
    
        t.Start();
    
     
    
        t.Join(); //         
    
     
    
        Console.WriteLine ("Thread t's ReadLine complete!");
    
     
    
        }
    
     
    
    }

    Join 방법도 밀리초를 사용하거나 Timespan 클래스를 사용하는 시간 초과 파라미터를 수신합니다. 시간 초과가false로 되돌아오고, 라인이 종료되면true로 되돌아갑니다.
    Join이 가지고 있는 시간 초과 매개 변수는 Sleep 방법과 매우 비슷하며 실제로 아래의 두 줄 코드는 거의 차이가 없다.
    Thread.Sleep (1000);
    Thread.CurrentThread.Join (1000);

    이들의 차이점은 단선정 응용 프로그램 영역과COM의 상호작용성에 있다. 막을 때 Join은 정보 포획을 유지하고, Sleep은 정보 포획을 일시 정지한다.

    좋은 웹페이지 즐겨찾기