C# 멀티 스레딩

선비Sunbei·2023년 2월 11일
0

C#

목록 보기
16/18
post-thumbnail

System.Threading.Thread

using System;
using System.Threading;

namespace ConsoleApp2
{
    class Program
    {

        static void newThreading()
        {
            Console.WriteLine("First Line");
            Thread.Sleep(1000);
            Console.WriteLine("1 sec later");
        }


        static void Main(string[] args)
        {
            Console.WriteLine("Main Function Start");
            Thread thread = new Thread(newThreading);
            thread.Start();
            Console.WriteLine("Main Function is Down");
        }
    }
}

C#의 경우 C++과는 다르게 기본값으로 Thread Function을 실행 시 Foreground에서 작동된다. C++에서는 기본 값으로 Background에서 실행되는데 이 설정의 차이는 메인 쓰레드가 종료될 시 같이 종료되면 Background, 메인 쓰레드가 종료돼도 여전히 작동한다면 Foreground 이다.

몇 가지 Thread에 유용한 함수가 존재한다.

        static void newThreading()
        {
            Console.WriteLine("First Line");
            Thread.Sleep(1000);
            Console.WriteLine("1 sec later");
        }


        static void Main(string[] args)
        {
            Console.WriteLine("Main Function Start");
            Thread thread = new Thread(newThreading);
            thread.Start();
            thread.Join();
            Console.WriteLine("Main Function is Down");
        }

다음과 같이 Join 함수를 쓰면 해당 쓰레드가 종료될 때까지 wait상태가 된다.

System.Threading.ThreadPool

C#에서는 사용자의 편의를 위해서 쓰레드 풀을 미리 만들어줬다.

        static void newThreading(Object obj)
        {
            Console.WriteLine("First Line");
            Thread.Sleep(1000);
            Console.WriteLine("1 sec later");
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Main Function Start");
            ThreadPool.QueueUserWorkItem(newThreading);
            Thread.Sleep(2000);
            Console.WriteLine("Main Function is Down");
        }

ThreadPool은 따로 객체로 인스턴스화 할 필요없다.
ThreadPool을 사용할 때 Thread와의 차이점이 존재한다.
1. 넘겨주는 함수의 파라미터로 Object를 넘겨줘야 한다.
2. 기본 설정이 Background로 Main Thread가 끝나면 쓰레드 풀에서 실행되는 것도 끝난다.

몇 가지 함수를 설명하면
QueueUserWorkItem은 작업 큐에 작업을 진행할 함수를 넣어준다.
GetMaxThreads는 동시에 활성 상태가 될 수 있는 스레드 풀에 대한 값을 리턴한다.
SetMaxThreads는 동시에 활성 상태가 될 수 있는 스레드 풀에 대한 값을 설정합니다.

System.Threading.Tasks

Task는 일반적으로 비동기적으로 실행되는 단일 작업이다.
주 애플리케이션 스레드에서 동기적으로 실행되지 않고, 스레드 풀 쓰레드로써 비동기적으로 실행된다.

        static void newThreading()
        {
            Console.WriteLine("First Line");
            Thread.Sleep(1000);
            Console.WriteLine("1 sec later");
        }
        static void Main(string[] args)
        {
            Task task = new Task(newThreading);
            Console.WriteLine("Main Function Start");
            task.Start();
            task.Wait();
            Console.WriteLine("Main Function is Down");
        }

Wait는 Thread의 join과 같은 뜻으로 사용된다.
Task가 스레드 풀에서 작동하다보니 기본 값 또한 Background에서 실행된다.

Task와 Thread의 차이

  1. Thread는 운영체제의 기본 스레딩 기능에 대한 직접 접근하여 실행되는 반면, Task는 .Net 런타임에 의해서 ThreadPool에 예약하여 실행한다.
  2. Thread에서는 예외처리가 되지않을 경우 프로그램을 종료되지만, Task는 Task만 종료하며 해당 문제에 대해서 처리할 수 있다.
  3. Thread는 값을 반환하기 위해서는 따로 편법을 사용해야 하는 반면에, task는 Result를 반환하는 메커니즘을 제공한다.

0개의 댓글