* 프로세스와 스레드
- 프로세스는 반드시 하나 이상의 스레드로 구성되어진다.
- 둘 이상의 스레드를 동시에 실행하면 멀티스레드라 한다.
* 스레드
- 운영체제가 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);
}
}
위와 같이 스크립트를 작성하고 플레이해보면 오류가 뜬다.

유니티에서 제공하는 속성들은 메인 스레드에서만 사용할 수 있기 때문이다.
* 그러면 유니티에서 멀티쓰레드는 어디에 쓰는걸까?
성능 향상을 위해 유니티 메인 로직과 분리할 수 있으면서 연산이 무거운 것들을 멀티쓰레드로 사용할 수 있다.
예를 들면 시간이 오래 걸리는 복잡한 계산(길찾기 알고리즘), 파일 로드, 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("스레드 종료");
}
}
출처
'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 |