다음을 통해 공유


스레드 동기화

업데이트: 2007년 11월

스레드 응용 프로그램을 작성할 때 개별 스레드를 프로그램의 다른 부분과 동기화해야 하는 경우가 있습니다. 동기화하면 다중 스레드 프로그래밍의 비구조적 특징과 동기 처리의 구조적 순서를 절충할 수 있습니다.

다음의 경우에 동기화 기술을 사용합니다.

  • 작업이 특정 순서로 수행되어야 할 때마다 코드가 실행되는 순서를 명시적으로 제어하려는 경우

    - 또는 -

  • 두 개의 스레드에서 동시에 같은 리소스를 공유하는 경우 발생할 수 있는 문제를 방지하려는 경우

예를 들어, 다른 스레드에서 실행 중인 데이터 검색 프로시저가 완료될 때까지 표시 프로시저가 대기하도록 하려는 경우에 동기화를 사용할 수 있습니다.

동기화 기술

동기화에는 폴링과 동기화 개체 사용이라는 두 가지 방법이 있습니다. 동기화 개체에 대한 자세한 내용은 고급 동기화 기술을 참조하십시오.

폴링

폴링은 루프 내에서 비동기 호출의 상태를 반복적으로 검사하는 것입니다. 폴링은 다양한 스레드 속성의 상태를 반복적으로 검사함으로써 많은 리소스를 소모하므로 가장 효율성이 낮은 스레드 관리 방법입니다.

예를 들어, 스레드가 종료되었는지 확인하기 위해 폴링에서 IsAlive 속성을 사용할 수 있습니다. 그러나 활성화되어 있는 스레드가 반드시 실행 중인 것은 아니므로 이 속성을 사용할 때는 주의해야 합니다.

스레드의 ThreadState 속성을 사용하면 스레드 상태에 대한 보다 자세한 정보를 얻을 수 있습니다. 스레드는 특정 시간에 여러 상태일 수 있으므로 ThreadState에 저장된 값은 System.Threading.ThreadState 열거형의 값이 여러 개 결합된 것일 수 있습니다. 따라서 폴링할 때는 관련된 모든 스레드 상태를 신중하게 검사해야 합니다. 예를 들어, 스레드 상태가 Running이 아니면 해당 스레드가 완료되었을 수 있습니다. 그러나 한편으로는 일시 중단되었거나 대기 중인 스레드일 수도 있습니다.

스레드 완료 시까지 대기

Thread.Join 메서드는 다른 작업을 시작하기 전에 스레드가 완료되었는지 여부를 확인하는 데 유용합니다. Join 메서드는 스레드가 완료될 때까지 지정한 시간 동안 대기합니다. 또한 제한 시간 이전에 스레드가 완료되면 Join은 True를 반환하고 그렇지 않으면 False를 반환합니다.

폴링을 사용하면 스레드가 실행되는 순서를 제어할 수 있는 대신 다중 스레드의 여러 가지 장점을 누릴 수 없게 됩니다. 이러한 손실이 너무 크기 때문에 일반적으로는 폴링을 사용하지 않는 것이 좋습니다. 보다 효율적인 방법은 Join 메서드를 사용하여 스레드를 제어하는 것입니다. Join 메서드를 사용하면 호출하는 프로시저는 스레드가 완료될 때까지 또는 호출 제한 시간이 지정된 경우 이 시간을 초과할 때까지 대기하게 됩니다. "join"이라는 이름은 새 스레드를 만들 경우 실행 경로가 여러 개로 나뉜다는 개념에서 비롯된 것입니다. 이러한 개별 실행 경로는 Join을 사용하여 하나의 스레드로 다시 병합될 수 있습니다.

Set Thread 및 Join Thread

그림 1 스레딩

Join은 동기 또는 차단 호출이라는 점을 분명히 알아두어야 합니다. Join 또는 대기 핸들의 대기 메서드를 호출하면 호출하는 프로시저는 중지되어 스레드에서 완료 신호를 보낼 때까지 대기합니다.

Sub JoinThreads()
    Dim Thread1 As New System.Threading.Thread(AddressOf SomeTask)
    Thread1.Start()
    Thread1.Join()      ' Wait for the thread to finish.
    MsgBox("Thread is done")
End Sub
Sub SomeTask()
    ' Insert code to perform a task here.
End Sub

이러한 간단한 스레드 제어 방법은 적은 수의 스레드를 관리할 때 유용하지만 대규모 프로젝트에서는 사용하기 어렵습니다. 고급 동기화 기술에서는 스레드를 동기화할 때 사용할 수 있는 몇 가지 기술을 설명합니다.

참고 항목

개념

Visual Basic의 고급 다중 스레딩

다중 스레드 프로시저의 매개 변수 및 반환 값

기타 리소스

Visual Basic의 다중 스레딩