Garbage Collection

塵も積もれば山

目次

Blog 利用状況

ニュース

C++とかC#とか数学ネタを投下していく予定です。

[その他のページ]
日々の四方山話を綴った日記出水の日記帳

書庫

日記カテゴリ

[C][Lua]コルーチンの親権

[C][Lua]カタがコルーチンの続きです。

前回、コルーチンの生成/呼び出しにLuaを使ってましたが、
数が多くなってくると生成/呼び出し関数を作るのが面倒です。

そこで、Cから直接コルーチンを呼び出す方法です。

int _tmain(int argc, _TCHAR* argv[]){
  lua_State *L = lua_open(), *co;
  luaL_openlibs(L);

  luaL_dofile(L, "test.lua");

  co = lua_newthread(L);
  lua_getglobal(co, "f");

  for(;;){
    lua_resume(co, 0);

    if (lua_type(co, -1) == LUA_TNIL) break;
    printf("%s\n", lua_tostring(co, -1));

    if (_getch() == 27) break;
  }

  lua_close(L);
  return 0;
}

新たにcoというlua_Stateを定義し、lua_resumeを呼ぶだけです。
引数を渡すときはco側に積み、返り値もco側に積まれます。

ただ、いくつか問題があって、このコルーチンを途中で破棄したいとしても
明示的にコルーチンを破棄する方法はありません。
しかし、解放されないわけではなく、GCによって自動的に解放されます。

Lのスタックを見てみると、lua_newthread()を実行した時点で、スタックが一つ増えています。
これがコルーチンの情報で、スタックに乗り続ける限り参照ありとしてGCの対象から外れます。
そして、スタックから取り除けば、そのうちGCによって解放されます。
つまり、コルーチンを使っている間はスタックから取り除いてはいけません。

今回のようにひとつだけ、というのであればこのままでも問題ありませんが、
たくさんのコルーチンを使うとなると、スタックで管理というのはいただけません。

これを何とかする方法もあるのですが、本格的にコルーチンを実装するとなると、
C側で管理するより、Lua側でコルーチンライブラリを作って管理した方が良いのではないかという気がします。

投稿日時 : 2009年2月25日 22:56

Feedback

# KBwcYiCcPugH 2011/12/13 18:18 http://www.birthcontrolremedy.com/birth-control/cl

The material is on the five plus. But there is a minus! My internet speed 56kb/sek. The page was loading for about 40 seconds!...

タイトル
名前
Url
コメント