3

良い一日をお過ごしください。

ここ数日、Lua で IRC チャットボットをプログラミングしてきましたが、ついに複数サーバー サポートの実装を開始したいと考えています。

これまでのところ、各サーバーを管理するための irc "オブジェクト" を作成しましたが、これまでのところ、スレッド化に問題があります。

ご存じのとおり、Lua にはスレッド サポートが組み込まれていません。ライブラリに関しては、LuaLanes と LuaThreads が、私が使いたかったものに最も近いように思えました。私が LuaLanes を選んだ理由は、LuaThreads には変更された lua コアが必要だからです。さらに、LuaLanes の "lindas" 機能が私の目を引きました (後でプラグインで使用するため)。

とにかく、私が抱えている問題は、関数を使用してレーンを生成しmiddleman(たとえば)、別の関数を呼び出す場合ですsqr(たとえば)。のような関数を生成するとlanes.gen({globals = _G}, middleman)、仲介者は現在のグローバルスコープ内のすべてにアクセスできます。これはまさに私が望んでいることです。問題は、 をmiddleman呼び出してグローバル スコープの何かsqrを使用すると、突然空になったsqrかのようにエラーがスローされることです。_G

上記の例を使用して、一緒に投げることができたコードの例を次に示します。

require 'lanes'

function sqr()
    print(5*5)
end

function middleman()
    sqr()
end

gen = lanes.gen({globals = _G}, middleman)

print(gen()[1])

次のエラーが表示されます。

tc@box:~$ lua lanestrouble.lua 
lua: lanestrouble.lua:4: attempt to call global 'print' (a nil value)
stack traceback:
        [C]: in function 'error'
        ./lanes.lua:190: in function <./lanes.lua:136>
        lanestrouble.lua:13: in main chunk
        [C]: ?
threading.c 399: pthread_cond_destroy(ref) failed, 16 EBUSY
Aborted
tc@box:~$ 

(ちなみにLinuxを使っています)

ただし、11 行目を からgen = lanes.gen({globals = _G}, middleman)に変更するとgen = lanes.gen({globals = _G}, sqr)、正常に動作します。

チェックしたところ、「*」(または「libs_str」パラメーターの他のオプション)を渡してデフォルトのライブラリをロードすると、同じことが起こります。

Lua 用の Java のスレッド ライブラリのようなものがあればいいのにと思います。それが私が最初にスレッドの使い方を学んだ方法です。(私が思う最も理想的な環境ではありません)

ありがとう、助けてくれてありがとう。特に、これは私の IRC ボット開発を完全に停止させてしまったので! :(

4

1 に答える 1

4

ローカルsqrにすることでうまくいきます。仲買人のアップバリューになるので、新しいレーンにコピーされます。

require 'lanes'

local function sqr()
    print(5*5)
end

function middleman()
    sqr()
end

gen = lanes.gen({globals = _G}, middleman)

print(gen()[1])

しかし、何か奇妙なことが起こっていることは間違いありません。つまり、明示的に「sqr」と「print」を新しいレーンに渡しても、「print」は表示されません (「sqr」によって呼び出された場合)。レーン間で関数をシリアル化するときに、何かが正しく機能していないように思えます。そのメンテナに連絡する必要があります。

于 2011-05-30T23:34:54.443 に答える