사용자 도구

사이트 도구


kb:luaapithread

LuaApi/Thread

코루틴 다루기

lua_newthread

lua_State *lua_newthread (lua_State *L);

새로운 코루틴을 생성해서 스택의 최상위에다 푸쉬하고, 코루틴 컨텍스트를 반환한다. 에러가 생긴 경우에는 NULL을 반환한다. 기본적으로 코루틴은 중지(suspend)된 상태다.

  • 새로운 코루틴은 기존 코루틴와 전역 오브젝트들을 공유한다.
  • 새로운 코루틴은 기존 코루틴와는 별개의 런타임 스택을 가진다.
  • 새로운 코루틴은 기존 코루틴와는 별개의 전역 테이블을 가진다.

:!: 코루틴의 메인 함수는 이 함수가 아니라 lua_resume 함수를 통해 지정하게 된다. 아래쪽의 lua_resume 함수를 참고하기 바란다.
:!: 5.0.2 이전 버전에는 lua_closethread 라는 함수로 코루틴를 명시적으로 삭제했던 모양인데, 5.0.2 이후부터는 가비지 컬렉션으로 자동 처리된다.

lua_resume

int lua_resume (lua_State *L, int narg);

해당 코루틴의 동작을 재개한다. narg는 코루틴 쪽으로 넘길 인수의 갯수로서, lua_resume을 호출하기 전에 푸쉬해둬야 한다.

최초로 lua_resume을 실행하는 경우, 즉 코루틴를 생성한 후 처음으로 실행하는 경우에는 코루틴의 몸체가 될 함수를 인수들보다 먼저 푸쉬해둬야 한다. 이후부터는 그냥 인수들만 푸쉬하면 된다.

최초로 호출하는 경우,       이후부터 호출하는 경우,
준비해야할 스택             준비해야할 스택
+-------------------+       
|       arg2        |       
+-------------------+       +-------------------+
|       arg1        |       |       arg2        |
+-------------------+       +-------------------+
|  thread function  |       |       arg1        |
+-------------------+       +-------------------+
|      thread       |       |       ...         |
+-------------------+       +-------------------+

이 함수가 리턴하는 경우는 세 가지이다. 첫번째는 코루틴 실행이 끝난 경우이고, 두번째는 lua_yield 함수를 이용해 코루틴의 동작을 중지시킨 경우이다. 그리고 마지막은 에러가 발생한 경우다.

케이스 리턴값 스택
코루틴 실행이 끝난 경우 0 코루틴 메인 함수가 반환한 값이 들어가 있다.
lua_yield를 호출한 경우 LUA_YIELD (1) lua_yield 함수에다 넘긴 인수들이 들어가 있다.
에러가 생긴 경우 0 or 1이 아닌 값 에러 메시지만이 들어가 있다.

lua_yield

int lua_yield (lua_State *L, int nresults);

루아 코루틴은 외부에서 동작을 중지시키는 것이 불가능하다. 그러므로 이 함수는 루아에다 등록한 C 함수 내부에서 다음과 같은 형태로만 사용할 수 있다.

return lua_yield(L, nresults);

왜 이런 식으로 밖에 사용할 수 없는지는, lua_resume 함수를 호출한 다음에 이 함수를 어디서 어떻게 호출할 것인지 찬찬히 생각해 보면 알 수 있을 것이다. nresult는 루아쪽으로 넘길 인수의 갯수로서, lua_yield를 호출하기 전에 푸쉬해둬야 한다.

lua_xmove

void lua_xmove (lua_State *from, lua_State *to, int n);

코루틴 간에 데이터를 교환하기 위한 함수다. from 코루틴의 스택에서 n 개만큼의 아이템을 팝해서, to 코루틴의 스택에다 푸쉬한다.


kb/luaapithread.txt · 마지막으로 수정됨: 2014/11/07 10:01 (바깥 편집)