1

マルチスレッド環境でLuaInterfaceを機能させる方法はありますか?

LuaInterfaceを使用してネイティブアプリケーションからのデータを処理するマルチスレッドc#(.Net 4)アセンブリがあります。各スレッドには、Luaインタープリターの独自のインスタンスがあります。Lua.GetFunction()スクリプトから関数を取得し、その関数を定期的に呼び出すために使用します。処理する関数に辞書を渡します。これは1つのスレッドで正常に機能します。しかし、2つのスレッドを使用すると、アプリ全体がクラッシュし、VisualStudioで次のようなエラーが表示されます。

The thread 'Win32 Thread' (0xa78) has exited with code -1073740791 (0xc0000409).

スクリプトを変更して、渡した辞書を使用しない些細なことを実行すると、複数のスレッドでも正常に機能します。

これを機能させるには、各インタプリタに独自のプロセスまたはAppDomainを与える必要がありますか?

4

3 に答える 3

1

2つの異なるスレッドから同じDictionaryオブジェクトを呼び出そうとすると、データ競合が発生します。Luaスクリプトがそう言ったのか、C#コードがそれを試みたのかは関係ありません。まだ競合状態です。そして、その辞書がスレッドセーフでない場合、悪意が生じる可能性があります。

したがって、このオブジェクトにスレッドセーフなアクセサーを提供するか、2つのスレッドから同じオブジェクトにアクセスしないようにする必要があります。これは実際にはLuaとは何の関係もありません。それは単なる基本的なマルチスレッドです。

于 2011-11-15T22:08:43.357 に答える
1

LuaInterfaceはスレッドセーフではありません。私が読んだことから、Lua自体がマルチスレッドをサポートしているように見えます(Lua Lanesを参照)。ただし、LuaInterface(v2.0.3.7)には、スレッドセーフになる前に解決すべきいくつかの問題があります。Luaインタープリターの個別のインスタンスを独自のスレッドに配置しても、これらの問題は解決されません。

于 2011-11-19T03:35:05.417 に答える
0

スクリプトは辞書で何をしていますか?辞書クラスはスレッドセーフではないため、これは適切です。

たとえば、あるスレッドで辞書が変更され、別のスレッドがそれを列挙している場合、そのスレッドはクラッシュします。

于 2011-11-15T22:08:29.783 に答える