2011-11-15 136 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