2011-11-15 85 views
1

有没有办法让LuaInterface在多线程环境中工作?LuaInterface多线程崩溃

我有一个多线程的c#(.Net 4)程序集,它使用LuaInterface处理来自本机应用程序的数据。每个线程都有自己的Lua解释器实例。我使用从脚本中检索函数并定期调用该函数。我将一个字典传递给要处理的函数。这对一个线程正常工作。但是,当我用两个线程崩溃了整个应用程序,我看到像在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

如果您尝试从两个不同的线程调用同一个Dictionary对象,那么您就有数据竞争。不要紧,因为Lua脚本是这么说的,或者是因为C#代码试图这样做。这仍然是一个竞争条件。如果该字典不是线程安全的,则可能导致不良。

因此,您需要为此对象提供线程安全访问器,或者您不需要从两个线程访问同一个对象。这与Lua没有什么关系。这只是基本的多线程。

+0

除了@Nicol Bolas的回答,'SyncLock'在这种情况下是你的朋友 – Basic