사용자 도구

사이트 도구


kb:luaapithread

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

kb:luaapithread [2014/11/07 10:01] (현재)
줄 1: 줄 1:
 +====== LuaApi/​Thread ======
 +코루틴 다루기
 +
 +===== lua_newthread =====
 +<code cpp>
 +lua_State *lua_newthread (lua_State *L);
 +</​code>​
 +새로운 코루틴을 생성해서 스택의 최상위에다 푸쉬하고,​ 코루틴 컨텍스트를 반환한다. 에러가 생긴 경우에는 NULL을 반환한다. 기본적으로 코루틴은 중지(suspend)된 상태다.
 +
 +  * 새로운 코루틴은 기존 코루틴와 전역 오브젝트들을 공유한다.
 +  * 새로운 코루틴은 기존 코루틴와는 별개의 런타임 스택을 가진다.
 +  * 새로운 코루틴은 기존 코루틴와는 별개의 전역 테이블을 가진다.
 +
 +:!: 코루틴의 메인 함수는 이 함수가 아니라 lua_resume 함수를 통해 지정하게 된다. 아래쪽의 lua_resume 함수를 참고하기 바란다. \\
 +:!: 5.0.2 이전 버전에는 lua_closethread 라는 함수로 코루틴를 명시적으로 삭제했던 모양인데,​ 5.0.2 이후부터는 가비지 컬렉션으로 자동 처리된다.
 +
 +
 +===== lua_resume =====
 +<code cpp>
 +int lua_resume (lua_State *L, int narg);
 +</​code>​
 +해당 코루틴의 동작을 재개한다. narg는 코루틴 쪽으로 넘길 인수의 갯수로서,​ lua_resume을 호출하기 전에 푸쉬해둬야 한다.
 +
 +최초로 lua_resume을 실행하는 경우, 즉 코루틴를 생성한 후 처음으로 실행하는 경우에는 코루틴의 몸체가 될 함수를 인수들보다 먼저 푸쉬해둬야 한다. 이후부터는 그냥 인수들만 푸쉬하면 된다.
 +<​code>​
 +최초로 호출하는 경우, ​      ​이후부터 호출하는 경우,
 +준비해야할 스택 ​            ​준비해야할 스택
 ++-------------------+ ​      
 +|       ​arg2 ​       |       
 ++-------------------+ ​      ​+-------------------+
 +|       ​arg1 ​       |       ​| ​      ​arg2 ​       |
 ++-------------------+ ​      ​+-------------------+
 +|  thread function ​ |       ​| ​      ​arg1 ​       |
 ++-------------------+ ​      ​+-------------------+
 +|      thread ​      ​| ​      ​| ​      ​... ​        |
 ++-------------------+ ​      ​+-------------------+
 +</​code>​
 +이 함수가 리턴하는 경우는 세 가지이다. 첫번째는 코루틴 실행이 끝난 경우이고,​ 두번째는 lua_yield 함수를 이용해 코루틴의 동작을 중지시킨 경우이다. 그리고 마지막은 에러가 발생한 경우다.
 +
 +^ 케이스 ^ 리턴값 ^ 스택 ^
 +| 코루틴 실행이 끝난 경우 | 0 | 코루틴 메인 함수가 반환한 값이 들어가 있다. |
 +| lua_yield를 호출한 경우 | LUA_YIELD (1) | lua_yield 함수에다 넘긴 인수들이 들어가 있다. |
 +| 에러가 생긴 경우 | 0 or 1이 아닌 값 | 에러 메시지만이 들어가 있다. |
 +
 +
 +===== lua_yield =====
 +<code cpp>
 +int lua_yield (lua_State *L, int nresults);
 +</​code>​
 +루아 코루틴은 외부에서 동작을 중지시키는 것이 불가능하다. 그러므로 이 함수는 루아에다 등록한 C 함수 내부에서 다음과 같은 형태로만 사용할 수 있다.
 +<code cpp>
 +return lua_yield(L,​ nresults);
 +</​code>​
 +왜 이런 식으로 밖에 사용할 수 없는지는,​ lua_resume 함수를 호출한 다음에 이 함수를 어디서 어떻게 호출할 것인지 찬찬히 생각해 보면 알 수 있을 것이다. nresult는 루아쪽으로 넘길 인수의 갯수로서,​ lua_yield를 호출하기 전에 푸쉬해둬야 한다.
 +
 +
 +===== lua_xmove =====
 +<code cpp>
 +void lua_xmove (lua_State *from, lua_State *to, int n);
 +</​code>​
 + ​코루틴 간에 데이터를 교환하기 위한 함수다. from 코루틴의 스택에서 n 개만큼의 아이템을 팝해서, to 코루틴의 스택에다 푸쉬한다.
 +
 +----
 +  * see also [[LuaApi]]
  
kb/luaapithread.txt · 마지막으로 수정됨: 2014/11/07 10:01 (바깥 편집)