(C# : Server) 2. Multi Thread

Posted by : at

Category : Charp-Server


// Thread 생성
static void MainThread()
{
    Console.WriteLine("Hello Thread!");
}

static void Main(string[] args)
{
    Thread t = new Thread(MainThread);
    t.Name = "Test Thread"; // Thread 이름도 지정가능
    t.Start();
}

Thread Fore/Back ground

// C#의 Thread는 Main이 종료되어도 같이 종료되지 않음
static void MainThread()
{
    while(true)
    {
        // 계속 Hello Thread가 출력됨
        Console.WriteLine("Hello Thread!");
    }
}

static void Main(string[] args)
{
    Thread t = new Thread(MainThread);
    //t.IsBackground = true;       // true로 변경시 Main과 같이 죽게된다.
    t.Start();
}

Join

// Thread 생성
static void MainThread()
{
    Console.WriteLine("Hello Thread!");
}

static void Main(string[] args)
{
    Thread t = new Thread(MainThread);
    t.Start();
    t.Join();   // Thread의 종료를 대기한다.
}

Thread를 만들지 말고 간단한 비동기 작업을 처리하고자 한다면?

// Thread 생성
static void MainThread(object state)
{
    for(int i = 0; i < 5; i++)
        Console.WriteLine("Hello Thread!");
}

static void Main(string[] args)
{
    ThreadPool.QueueUseWorkItem(MainThread);

    // 참고로 ThreadPool은 생명주기가 Main과 같기에 
    // 그냥 실행시 Main이 종료되며 자동으로 MainThread가 다 돌지않고 종료됨

    while(true)
    {
        // 따라서 while로 잠깐 잡아두자
    }
}
  • 그런데 ThreadPool을 사용하는 이유가 있을까?
    • Thread는 무겁기 때문에 오히려 ThreadPool를 사용하는게 유리할 수 있다
    • 따라서 차라리 Thread관리를 컴파일러에게 맡기는게 나을 수 있음
    • 그럼 ThreadPool는 만능인가?
    • 또 그렇지도 않은게 각 Thread에서 작업(연산량)이 많다면 오히려 ThreadPool이 느릴수 있음
    • 상황에 맞게 잘 사용하자
    • 여기서 상황인란 ThreadPool은 될 수 있으면 짧은 비동기 작업을 수행
// Thread 생성
static void MainThread(object state)
{
    for(int i = 0; i < 5; i++)
        Console.WriteLine("Hello Thread!");
}

static void Main(string[] args)
{
    ThreadPool.SetMinThreads(1 /* workerThreads */, 1 /* completionPortThreads */);
    // completionPortThreads : (network 등) InputOutput Thread 설정
    ThreadPool.SetMaxThreads(5, 5);

    for(int i = 0; i < 5; i++)
        ThreadPool.QueueUseWorkItem((obj) => {while(true) {}}); 
    // 무한으로 5개의 thread를 잡아보자

    // 여기 Thread가 돌아갈까?
    // -> 안돌아감
    ThreadPool.QueueUseWorkItem(MainThread);

위와 같이 특정 Thread가 ThreadPool을 잡고있을 수 있는 문제점을 해결해 보자

static void MainThread(object state)
{
    for(int i = 0; i < 5; i++)
        Console.WriteLine("Hello Thread!");
}

static void Main(string[] args)
{
    Task t = new Task((obj) => {while(true) {}}, TaskCreationOptions.LongRunning /* 오래걸리는 작업이라고 알려준다 */);

    // TaskCreationOptions.LongRunning을 옵션으로 넣을경우 별도의 Thread에서 관리해준다

    t.Start();

    // 정상동작함.
    ThreadPool.QueueUseWorkItem(MainThread);
}

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links