Coroutine(코루틴)과 Thread
- 작업 하나하나의 단위 : Coroutine Object
- 여러 작업 각각에 Object 를 할당한다.
- Coroutine Object 도 엄연한 객체이기 때문에 JVM Heap 에 적재 된다. (코틀린 기준)
- 동시성 보장 수단 : Programmer Switching (No-Context Switching)
- 프로그래머의 코드를 통해 Switching 시점을 마음대로 정함 (OS 관여 X)
- Suspend (Non-Blocking) : Object 1 이 Object 2 의 결과가 나오기까지 기다려야 한다면, Object 1 은 Suspend 되지만, Object 1 을 수행하던 Thread 는 그대로 유효하기 때문에 Object 2 도 Object 1 과 동일한 Thread 에서 실행될 수 있다.
- ex)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Co : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
IEnumerator attack()
{
yield return new WaitForSeconds(1.0f);
Debug.Log("attack");
for(; ; )
{
yield return new WaitForSeconds(1.0f / 30.0f);
}
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
StartCoroutine(attack());
}
}
}
Thread
- 작업 하나하나의 단위 : Thread
- 각 Thread 가 독립적인 Stack 메모리 영역 가짐
- 동시성 보장 수단 : Context Switching
- 운영체제 커널에 의한 Context Switching 을 통해 동시성 보장
- 블로킹 (Blocking) : Thread A 가 Thread B 의 결과가 나오기까지 기다려야 한다면, Thread A 은 블로킹되어 Thread B 의 결과가 나올 때 까지 해당 자원을 못 쓴다