[C#] Thread

* 프로세스와 스레드

- 프로세스는 반드시 하나 이상의 스레드로 구성되어진다.

- 둘 이상의 스레드를 동시에 실행하면 멀티스레드라 한다.

 

* 스레드

- 운영체제가 CPU에 시간을 할당하는 (일을 시키는) 기본 단위

- 운영체제가 명령어를 실행하기 위한 스케줄링 단위

 

* 멀티 스레드의 장점

1. 동시에 여러 작업을 할 수 있다.

2. 데이터 공유가 쉽다.

 

* 유니티에서 코루틴을 쓰는 이유

유니티는 게임 로직 쓰레드(메인 쓰레드) 1개에서만 게임 로직을 짤 수 있다. 스레드를 만들어 사용하면, 그 스레드에서는 유니티의 기능을 사용할 수없다. 그래서 코루틴을 사용해 병렬 처리(하지만 실제로는 동기로 작동)를 구현하는 것이다.

 

ex)

using System.Threading;
using UnityEngine;

public class ThreadTest : MonoBehaviour
{
    private void Start()
    {
        Thread thread = new Thread(PositionCheck);
        thread.Start();
    }

    private void PositionCheck()
    {
        Debug.Log(transform.position);
    }
}

 

위와 같이 스크립트를 작성하고 플레이해보면 오류가 뜬다.

 

UnityException: get_transform은 메인 스레드에서만 호출할 수 있습니다.

유니티에서 제공하는 속성들은 메인 스레드에서만 사용할 수 있기 때문이다.

 

* 그러면 유니티에서 멀티쓰레드는 어디에 쓰는걸까?

성능 향상을 위해 유니티 메인 로직과 분리할 수 있으면서 연산이 무거운 것들을 멀티쓰레드로 사용할 수 있다.

예를 들면 시간이 오래 걸리는 복잡한 계산(길찾기 알고리즘), 파일 로드, DB, 네트워크 통신에 사용할 수 있다.

 

 

* 스레드 사용법

Thread()는 델리게이트를 인자로 받는다!

그래서 함수를 인자로 넘김.

 

- 매개변수가 없는 경우

using System.Threading;
using UnityEngine;

public class ThreadTest : MonoBehaviour
{
	Thread thread;
    private void Start()
    {
        thread = new Thread(Temp);
        thread.Start();
    }

    private void Temp()
    {
        Debug.Log("스레드 시작");
        Debug.Log(thread.ThreadState);
        Thread.Sleep(2000); // 2초 동안 스레드 중지
        Debug.Log("스레드 종료");
    }
}

 

- 매개변수가 있는 경우

using System.Threading;
using UnityEngine;

public class ThreadTest : MonoBehaviour
{
	Thread thread;
    private void Start()
    {
        thread = new Thread(new ParameterizedThreadStart(Temp));
        // 델리게이트이므로 아래처럼 작성 가능
        thread = new Thread(Temp);
        thread.Start(10);
    }

    private void Temp(object num)
    {
        Debug.Log("스레드 시작");
        Debug.Log(thread.ThreadState);
        Thread.Sleep(2000); // 2초 동안 스레드 중지
        Debug.Log(num);
        Debug.Log("스레드 종료");
    }
}

 

- 매개변수가 여러개인 경우

using System.Threading;
using UnityEngine;

public class ThreadTest : MonoBehaviour
{
    public class Param
    {
        public int value1;
        public int value2;
    }

    Thread thread;
    void Start()
    {
        thread = new Thread(Temp);
        Param param = new Param();
        param.value1 = 10;
        param.value2 = 10;
        thread.Start(param);
    }

    void Temp(object num)
    {
        Debug.Log("스레드 시작");
        Debug.Log(thread.ThreadState);
        Thread.Sleep(2000);
        Param param = (Param)num;
        Debug.Log(param.value1);
        Debug.Log(param.value2);
        Debug.Log("스레드 종료");
    }
}

 

 


 

출처

- 유니티 C# 고급문법 Thread (스레드)

- 유니티 C# 고급문법 Multi Thread (멀티스레드)

'CS > C#' 카테고리의 다른 글

[C#] Thread의 상태  (0) 2025.08.13
[C#] readonly  (1) 2025.07.21
[C#] static, 싱글톤  (0) 2023.05.03
[C#] 상속과 가상함수, 추상함수  (0) 2022.07.31
[C#] 델리게이트(Delegate)와 이벤트(Event)  (0) 2022.07.28