Сбой многопоточности LuaInterface - PullRequest
1 голос
/ 16 ноября 2011

Есть ли способ заставить LuaInterface работать в многопоточной среде?

У меня есть многопоточная сборка c # (.Net 4), которая использует LuaInterface для обработки данных из собственного приложения. У каждого потока есть свой экземпляр интерпретатора Lua. Я использую Lua.GetFunction(), чтобы извлечь функцию из скрипта и периодически вызывать эту функцию. Я передаю словарь в функцию для обработки. Это прекрасно работает с одним потоком. Но когда я использую два потока, это приводит к сбою всего приложения, и я вижу такие ошибки в Visual Studio:

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

Если я изменю сценарий, чтобы сделать что-то тривиальное, когда он не использует Словарь, который я передаю ему, он также отлично работает с несколькими потоками.

Я собираюсь предоставить каждому интерпретатору свой собственный процесс или домен приложений, чтобы эта работа работала?

Ответы [ 3 ]

1 голос
/ 16 ноября 2011

Если вы пытаетесь вызвать один и тот же объект Dictionary из двух разных потоков, значит, у вас гонка данных. Не имеет значения, делает ли это это, потому что скрипт Lua сказал это, или потому что код C # пытался это сделать. Это все еще состояние гонки. И если этот словарь не является потокобезопасным, это может привести к ошибкам.

Таким образом, вам нужно либо предоставить поточно-ориентированные методы доступа к этому объекту, либо вам не нужно обращаться к одному и тому же объекту из двух потоков. Это на самом деле не имеет ничего общего с Луа; это просто базовая многопоточность.

1 голос
/ 19 ноября 2011

LuaInterface не является потокобезопасным. Из того, что я прочитал, сам Lua поддерживает многопоточность (см. Lua Lanes ). Тем не менее, LuaInterface (v2.0.3.7) все еще имеет некоторые проблемы , которые нужно решить, прежде чем он станет потокобезопасным. Помещение отдельных экземпляров интерпретатора Lua в собственный поток не решает эти проблемы.

0 голосов
/ 16 ноября 2011

Что скрипт делает со словарем?Это актуально, поскольку класс словаря не является потокобезопасным.

Скажем, если словарь был изменен в одном потоке, в то время как другой поток перечисляет его, этот поток будет аварийно завершаться.

...