본문 바로가기

프로그래밍/알고리즘

Coroutine

Windows기반의 개발자라면 Fiber라고 이해하면 된다.

개발의 난이도가 증가하면서 여러 개의 진입점이 있는 함수의 필요성을 느끼게 된다.
(간략히 말하자면 내가 제어 할 수 있는 Thread를 원하게 된다.)

그러나 일반적인 Thread는 개발자가 직접제어 하기에는 한계가 있다. 물론, 불가능 하다는 것은 아니다.

실제로 Thread를 개발자가 직접 제어하려는 순간 개발자의 의도와 상관없이 이미 제어권은 다른 곳으로 넘어가 버린다.

이러한 프로그램을 원하는 개발자를 위해 Coroutine을 제안한다. 나는 가끔 Windows 개발자는 축복받은 개발자가 아닌가 생각 한다.

UNIX(Linux) 개발자는 대부분 직접 만들거나 인터넷을 뒤져서 찾아야 한다.

그러나, Windows 기반으로 개발을 하다 보면 나도 모르게 탄성이 나오게 된다. 그 중 하나가 바로 Fiber라는 놈이다! 그럼, 이제 Coroutine에 대해서 본격적으로 알아 보자.

한번쯤 이런 조건의 프로그램을 할 때가 있다.
     

int CALC(A) { return A + get_B(); }


라는 프로그램을 할 때가 있다.

그런데, 이 상황에서 get_B()의 값을 얻는 조건이 외부적인 조건일 때가 있다.

Socket을 통해 받아야 하거나, 또는 다른 계산에 의해 만들어 져야 한다든가.. 결론은 B의 값을 만들기 위해 외부적인 조건이 있다는 것이다.  이 상황에서 대 부분의 개발자는 A라는 값을 저장해 두고, B라는 값이 만들어 질 때 까지 기다리게 된다.

그런데 문제는 여기에서 발생이 된다. 해당 값을 구해야 하는 조건이

    int getDamage( USER *u, AttackInfo *atk) {
        int damage = getDefaultDamage(u);
        ...
        int C = CALC(A) + getTargetCalc( atk);
        ...
        return damage;
    }


처럼 복잡한 함수의 중심에 위치하고 있다면… 실제로 이런 유형의 프로그램이 존재한다.

이럴 경우 빛을 발하는 것이 바로 Coroutine이다. 실제 함수는 종료되지 않고 현재 위치를 잠시 대기 시켰다고,  B의 값이 만들어 지는 시점에 대기된 시점부터 다시 시작할 수 있기 때문이다.

즉, 프로그램의 처리를 잠시 Suspend 시켰다가 다시 Resume이 된다면...

http://en.wikipedia.org/wiki/Coroutine 에서 좀더 많은 정보를 얻을수 있다.