C# - Thread

Alpha, Orderly·2023년 7월 14일
0

CSharp

목록 보기
11/11

Thread.Sleep(ms)

  • 주어진 시간 ( millisecond ) 만큼 스레드를 멈춘다.

기본 형태

new Thread(() =>
            {
                // 실행하고자 하는 함수가 들어간다.
            }).Start();
  • Thread를 생성하고 실행하는 기본적인 형태.
  • Thread 클래스는 시작 메소드인 Start 와 종료를 기다리는 Join 메소드를 가지고 있다.
    • Join 메소드에 밀리세컨드를 지정해 멈출 시간을 정할수 있다.
  • 쓰레드 내부에서 자기자신을 받기 위해 Thread.CurrentThread 를 사용할수 있다.
  • Background 를 True로 함으로, 백그라운드 스레드로 실행되게 할수 있다.
    • 메인스레드/포그라운드 스레드 종료시 같이 종료된다.
  • IsAlive 를 통해 실행 여부를 확인할수 있다.

TaskCompletionSource

var taskCompletionSource = new TaskCompletionSource<bool>();
// 위와 같이 지정한다, 제네릭 타입의 경우 최종적으로 받아올 값을 설정하면 된다.
taskCompletionSource.TrySetResult(true);
// 우선되어야 하는 작업을 먼저 끝낸 후 위와 같이 값을 설정해주면
var test = await taskCompletionSource.Task;
// SetResult가 되기 직전까지 여기에서 await하다 값을 받아서 다음 코드를 실행하게 된다.

ThreadPool

  • Thread의 갯수를 관리한다.
  • ThreadPool.QueueUserWorkItem(실행시킬 함수) 를 통해 콜백 함수를 큐에 대기시킨다.
  • 백그라운드 스레드로 실행되기에, 메인 스레드가 종료되면 같이 종료된다.

Thread Lock

  • 특정 부분에 한 스레드만 접근할수 있도록 한다.
class Data
{
    private object obj = new object();
    public int num = 0;

    public void Increase()
    {
    	lock (obj)
        {
            this.num++;
            Thread.Sleep(5);
        }
    }
}
  • 일종의 자물쇠 역할을 하는 object를 생성한 뒤
  • lock을 통해 한 스레드만 접근할수 있도록 설정 한 모습이다.

세마포어

_resourcePool = new Semaphore(0, 3);
// 0 ~ 3 개의 스레드를 실행할수 있는 세마포어
_resourcePool.Release(3);
// 세마포어의 값을 3으로 바꾸는 코드
_resourcePool.WaitOne();
// 스레드 실행 이전에 대기하는 코드, 세마포어 값이 증가하면 1을 줄이고 실행
_resourcePool.Release();
// 세마포어의 실행이 끝나면 실행, 세마포어 값을 1 증가시킨다.
profile
만능 컴덕후 겸 번지 팬

0개의 댓글