2011-11-15 5 views
1

マルチスレッド環境でLuaInterfaceを動作させる方法はありますか?LuaInterfaceマルチスレッドクラッシュ

私は、ネイティブアプリケーションからのデータを処理するためにLuaInterfaceを使用するマルチスレッドのC#(.Net 4)アセンブリを持っています。各スレッドには、独自のLuaインタプリタのインスタンスがあります。私はを使ってスクリプトから関数を取り出し、その関数を定期的に呼び出す。処理する関数に辞書を渡します。これは、1つのスレッドで正常に動作します。私は2つのスレッドを使用する場合しかし、それは全体のアプリがクラッシュし、私は、Visual Studioには、次のようなエラーを参照してください。

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

私はそれは私がそれに渡す辞書を利用しない些細な何かをするためのスクリプトを変更した場合複数のスレッドでうまく動作します。

私は各インタプリタに独自のプロセスまたはAppDomainを与えてこの作業を行わなければなりませんか?

+0

一部のコードは、問題をよりよく理解するのに役立ちます。 – kikito

+0

私は問題を示す簡略化されたプロジェクトに取り組んでいます。問題はそれが動作することです!私は明日仕事で私のコードとそれを比較する必要があります。できるだけ早くコードを投稿します。 – Galen

答えて

1

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

0

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

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

+0

辞書から値を読み取っています。各スレッドは、スクリプトに渡す独自の辞書を所有しています。だから私はそれが問題だとは思わない。私が辞書を使用していた唯一の理由は、LuaTableを使用していたためで、私はある時点で問題の一部になっている可能性があると考えました。私はいくつかの調査をした後、明日にコードを投稿します。 – Galen

1

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

このオブジェクトにスレッドセーフなアクセッサを提供するか、2つのスレッドから同じオブジェクトにアクセスする必要があります。これは本当にルアとは関係ありません。基本的なマルチスレッドです。

+0

ニコール・ボラスの答えに加えて、「シンクロック」はあなたの友人です – Basic