반응형

이 예제에서는 보조 또는 작업자 스레드를 만들고 기본 스레드와 함께 이 스레드를 병렬로 사용하여 작업 처리를 수행하는 방법을 보여 줍니다. 또한 다른 스레드의 작업이 끝날 때까지 한 스레드가 대기하도록 만들고 스레드를 올바르게 종료하는 방법도 보여 줍니다. 다중 스레딩에 대한 배경 정보는 관리되는 스레딩  스레딩 사용(C# 프로그래밍 가이드)을 참조.

 

Worker 클래스에는 DoWork에 반환할 시기를 알리는 데 사용되는 추가 메서드가 포함됩니다. RequestStop이라는 이 메서드는 다음과 같습니다.

 

RequestStop 메서드는 _shouldStop 데이터 멤버를 true로 할당하기만 합니다. 이 데이터 멤버는 DoWork 메서드에서 검사하므로 이는 간접적으로 DoWork가 반환되도록 하여 결과적으로 작업자 스레드가 종료됩니다. 그러나 중요한 점은 DoWork와 RequestStop이 서로 다른 스레드에서 실행된다는 사실입니다. DoWork는 작업자 스레드에서 실행되고 RequestStop은 기본 스레드에서 실행되므로 _shouldStop 데이터 멤버는 다음과 같이 volatile로 선언됩니다.

 

volatile 키워드는 여러 스레드가 _shouldStop 데이터 멤버에 액세스하므로 이 멤버의 상태에 대한 최적화 가정을 하지 말아야 한다는 사실을 컴파일러에 경고로 알립니다. 자세한 내용은 volatile(C# 참조)을 참조

 

 

Abort를 호출하여 다른 스레드에서 스레드를 종료할 수도 있습니다. 이 방법을 사용하면 스레드의 작업이 완료되었는지 여부와 관계없이 스레드가 종료되어 리소스를 정리할 수도 없습니다. 따라서 이 예제에서 설명하는 방법을 사용하는 것이 더 좋습니다.

마지막으로, Main 함수가 작업자 스레드 개체에 대한 Join 메서드를 호출하니다. 이 메서드는 개체가 가리키는 스레드가 종료될 때까지 현재 스레드를 차단하거나 대기 상태로 만듭니다. 따라서 Join은 작업자 스레드가 반환되고 자체 종료될 때까지 반환되지 않습니다.

 

이 단계에서는 Main을 실행하는 기본 스레드만 남게 됩니다. 이 스레드는 최종 메시지 하나를 표시한 다음 반환되고 종료됩니다.

 

= 출력 =

main thread: starting worker thread...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: terminating gracefully...
main thread: worker thread has terminated

반응형

+ Recent posts