[C#] Thread

2022-04-29

C#에서의 Thread에 대해 간단히 정리한다.


업무를 진행하다가 쓰레드를 사용하면 더 좋을법한 곳이 있었다. 그래서 내 기준에서의 이해하기 쉽도록 C#에서의 쓰레드 사용법을 정리해보았다.

Thread의 개념

프로세스(process)란?

사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행 중인 것을 말한다.
이러한 프로세스는 프로그램에 사용되는 데이터와 메모리 등의 자원 그리고 스레드로 구성된다.

쓰레드(thread)란?

쓰레드(thread)란 프로세스(process) 내에서 실제로 작업을 수행하는 주체를 의미한다.
모든 프로세스에는 한 개 이상의 쓰레드가 존재하여 작업을 수행한다.
또한, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 한다.


using System.Threading;

스레드에 관련된 기능들은 System.Threading를 이용해 사용할 수 있다.


Thread thread = new Thread(() => Run(0));
thread.Start();

사용하는 방법은 간단하게 Thread 객체를 생성하고 생성자의 매개변수로 쓰레드로 돌리고자 하는 기능을 넣어준 뒤 Start() 함수를 호출하면 된다. 쓰레드를 생성하기만 하고 Start() 함수를 호출하지 않으면 동작하지 않는다.


Thread.Sleep(10);

스레드가 몇 번의 연산을 처리하고 잠시 다른동안 상태를 멈출 수 있도록 하는 Thread.Sleep() 함수가 있다.


thread.Abort();
thread.Join();

작동 중인 스레드를 중지하는 방법은 두 가지가 있는데 Abort() 함수와 Join() 함수가 있다.
이 두 함수의 차이는 다음과 같다.

  • Abort() :: 함수의 종료를 보장하지 않고 어느 시점이던지 상관 없이 도중에 강제로 중단시킨다.
  • Join() :: 함수의 종료를 보장하며 스레드가 동작시키는 중인 함수의 끝에 도달하기를 기다린 다음에 스레드를 닫는다.

using System;
using System.Threading;

public class Simple
{
    public static void Main()
    {
        ServerClass serverObject = new ServerClass();
        // InstanceMethod method 생성
        Thread InstanceCaller = new Thread(
            new ThreadStart(serverObject.InstanceMethod));
        InstanceCaller.Start();

        Console.WriteLine("The Main() thread calls this after "
            + "starting the new InstanceCaller thread.");

        // StaticMethod method 생성
        Thread StaticCaller = new Thread(
            new ThreadStart(ServerClass.StaticMethod));

        StaticCaller.Start();

        Console.WriteLine("The Main() thread calls this after "
            + "starting the new StaticCaller thread.");
    }
}

public class ServerClass
{
    public void InstanceMethod()
    {
        Console.WriteLine(
            "ServerClass.InstanceMethod is running on another thread.");

        // 잠시 멈춤
        Thread.Sleep(3000);
        Console.WriteLine(
            "The instance method called by the worker thread has ended.");
    }

    public static void StaticMethod()
    {
        Console.WriteLine(
            "ServerClass.StaticMethod is running on another thread.");

        // 잠시멈춤
        Thread.Sleep(5000);
        Console.WriteLine(
            "The static method called by the worker thread has ended.");
    }
}

결과는 다음과 같이 출력된다.

The Main() thread calls this after starting the new InstanceCaller thread.

The Main() thread calls this after starting the new StaticCaller thread.

ServerClass.StaticMethod is running on another thread.

ServerClass.InstanceMethod is running on another thread.

The instance method called by the worker thread has ended.

The static method called by the worker thread has ended.

해당 예제에서는 서로 다른 개체에서 인스턴스 및 정적 메서드를 호출하는 두 개의 새 쓰레드를 만든다.
그리고 실행을 하고나서 sleep()을 이용해 다른 쓰레드 쪽에서 사용할 수 있도록 하는 예제이다.

데이터 전달

ParameterizedThreadStart는 Thread.Start(Object)를 호출할 때 데이터를 포함하는 개체를 쓰레드에 전달하는 간편한 방법을 제공한다.


using System;
using System.Threading;

public class ThreadWithState
{
    private string boilerplate;
    private int numberValue;

    // 생성자를 이용해 데이터를 쓰레드에 데이터를 넘겨주자.
    public ThreadWithState(string text, int number)
    {
        boilerplate = text;
        numberValue = number;
    }

    public void ThreadProc()
    {
        Console.WriteLine(boilerplate, numberValue);
    }
}

public class Example
{
    public static void Main()
    {
        //위에서 사용하고자 하는 ThreadWithState를 만들었으니, 데이터를 넘겨서 사용하자
        ThreadWithState tws = new ThreadWithState(
        "This report displays the number {0}.", 42);
                Thread t = new Thread(new ThreadStart(tws.ThreadProc));
                t.Start();
                Console.WriteLine("Main thread does some work, then waits.");
                t.Join();
                Console.WriteLine(
                    "Independent task has completed; main thread ends.");
    }
}

결과는 다음과 같이 출력된다.

Main thread does some work, then waits.

This report displays the number 42.

Independent task has completed; main thread ends.

참고링크 :

MS - .Net Framework 공식문서