C# - 스레드(Thread)와 동기화

Claire·2024년 10월 30일
post-thumbnail

스레드

스레드란?

메모리에 올라와 실행되고 있는 프로그램의 인스턴스

프로세스 내에서 실행되는 여러 흐름의 단위를 스레드라고 하며, 한 개의 프로세스 내에서 여러 개의 스레드가 독립적으로 수행된다.
두 개 이상의 스레드가 동적하는 것을 멀티 스레드라고 한다

스레드 클래스

  1. System.Threading 네임 스페이스에서 스레드를 생성, 종료, 제어 기능을 제공하는 Thread 클래스

    public sealed class Thread
    주요 기능내용
    Interlocked멀티스레드 기반에서 스레드 간에 공유되는 객체를 동기화
    Monitorlocks, wait, signals를 통해서 스레드 객체를 동기화
    Mutex두 개 이상의 스레드가 공유 자원에 동시에 접근할 때 동기화
    Thread스레드를 생성하고 제어하는 기능을 제공
    ThreadPool해당 프로세스 내의 스레드들을 관리하는 기능을 제공
    Timer설정한 시간 간격으로 메소드를 실행하도록 기능을 제공
    ThreadStart스레드에서 실행되는 메소드를 등록하는 델리게이트
    WaitCallback스레드 풀에 의해 실행될 콜백 메소드를 나타내는 델리게이트
    TimerCallback타이머에 의해 호출되는 ㅔㅁ소드를 등록하는 델리게이트
    ThreadState스레드의 상태를 지정
    ThreadPriority스레드의 우선순위를 지정
  2. 스레드 시작: ThreadStart 델리게이트
    : 스레드로 사용할 메소드를 참조할 수 있게 해주는 델리게이트는 특정 메소드의 기능을 대신 위임받아서 처리하는 기능을 한다.

    ThreadStart ts = new ThreadStart(ThreadFunction);
    Thread thd = new Thread(ts);
    thd.Start();
  3. 주요 메소드

메소드설명
Abort()이 메소드가 호출되는 스레드에서 ThreadAbortException을 발생시켜 스레드 종료 프로세스를 시작
Join()스레드가 종료될 때까지 대기하면서 호출 스레드를 차단
Resume()일시 중지된 스레드를 다시 시작
Sleep()지정된 시간동안 현재 스레드를 일시 중지
Start()현재 스레드 객체를 동작(Running) 상태로 변경
Suspend()현재 동작하고 있는 스레드를 일시 중지

스레드풀(Thread Pool)

: 풀은 '웅덩이', '연못'이라는 의미로, 스레드풀은 일정한 양의 스레드를 미리 메모리에 할당시켜놓은 집합이다.
스레드풀은 사용 가능한 작업 스레드를 할당받아 계속 돌려쓰는 방식으로, 스레드를 생성 및 제거하는 작업에는 많은 자원이 소모된다.

이미지에서 처리할 작업 하나하나를 태스크(Task)라고 한다.

스레드풀 사용 문법

: ThreadPool 클래스에서 제공하는 대표적인 메소드가 QueueUserWorkItem()으로, 스레드 실행을 위해 메소드를 큐에 대기시키는 기능을 한다. 큐에 대기중인 메소드는 스레드풀의 스레드를 사용할 수 있을 때 실행한다.

public static bool QueueUserWorkItem(System.Threading.WaitCallback callBack);
  • 전달인자로 WaitCallBack()이라는 콜백 메소드를 나타내는 델리게이를 갖는다.
  • 콜백 메소드가 성공적으로 큐에 대기되면 true를 반환
  • 작업항목을 큐에 대기할 수 없으면 NotSupportedException 예외 발생

스레드 동기화

여러 곳에서 자원 요청 시, 순서대로 자원을 사용한다는 개념

스레드의 갯수가 많아질수록 문제가 발생하는데, 여러 개의 스레드가 한 개의 공유 자원을 사용할 때 발생한다. 이러한 문제를 해결하려면 공유자원을 질서를 지켜서 사용하면 된다. 이러한 개념을 동기화라고 하며, 동기화를 하는 방법은 lock, Monitor, Mutex 등의 방법이 있다.

1. Monitor 클래스를 이용한 동기화

Monitor 클래스는 lock문보다 조금 더 정교한 동기화 기법을 제공하는데 임계영역의 시작점과 끝점을 임의적으로 조정할 수 있고, 임계 영역에서 보호받을 공유 자원 설정도 가능하다.

사용방법

// Monitor 요청
Monitor.Enter(lockObject);

// Monitor 해제
Monitor.Exit(lockObject);

2. Mutex 클래스를 이용한 동기화

Mutex는 상호배제라는 뜻을 가지고 있는데, 공유자원의 동시접근을 막기위한 알고리즘이다.

사용방법

// 객체 생성
Mutex mtx = new Mutex(false, "mtxObj");

// Mutex 요청
mtx.WaitOne();

// Mutex 해제
mtx.ReleaseMutex();
profile
SEO 최적화 마크업 개발자입니다.

0개의 댓글