Вопрос к разработчикам: можно ли вызывать getQuoteLevel2 в потоке main?

Страницы: 1
RSS
Вопрос к разработчикам: можно ли вызывать getQuoteLevel2 в потоке main?
 
В длл на Си сидят обработчики OnQuote и функция main. Чтобы не грузить поток Квика, хочется вызывать тяжёлую функцию getQuoteLevel2 в main, передавая ей через очередь событий, организованную в длл, тикер и его класс из обработчика события OnQuote. Не получится ли гонка между потоками, когда main будет вызывать getQuoteLevel2 через Lua state L
static int forLua_main(lua_State *L)
и когда какой-нибудь обработчик вызовется из Квика (в другом потоке) через этот же L
static int forLua_OnQuote(lua_State *L)
ведь в Квике L используется всегда один и тот же? Или нет, поясните, как создаётся и используется это состояние L.
 
Вот чем меня пытается пугать большая языковая модель, обученная Гуглом:
Цитата
Почему main — это "ловушка" для getQuoteLevel2?
Хотя потоки разные, экземпляр lua_State* L у них общий. Если вы одновременно вызовете функцию Lua API (например, getQuoteLevel2) из потока main в тот момент, когда поток колбэков записывает данные в стек через OnAllTrade, вы получите Race Condition (состояние гонки). Это приведет к повреждению внутренних структур Lua и падению терминала (Access Violation).
Чтобы это работало, разработчики QUIK используют внутренний мьютекс (Lock). Когда выполняется колбэк, main "засыпает", и наоборот. То есть параллельности на уровне Lua-движка всё равно нет — они работают по очереди.

Что-то я сомневаюсь насчёт существования этого мьютекса и засыпания этих потоков по очереди...
 
Вот ещё цитата от гугловской модели, прокомментируйте её:
Цитата
Как QUIK управляет потоками (факты)
  • Параллельность есть: Поток main и поток колбэков — это разные системные потоки. Они могут работать одновременно на разных ядрах процессора.
  • Гонка за L: Если ваш main вызывает getQuoteLevel2 (через API Lua), а в это же время Квик пытается запушить сделку в OnAllTrade, они оба обращаются к полю L->top. Без синхронизации это 100% краш.
  • Кто держит замок: Внутри qlua.dll (или самого терминала) вызовы к Lua API почти всегда обернуты в критическую секцию. Когда Квик вызывает ваш колбэк, он «захватывает» состояние L. Если в этот момент main хочет вызвать getQuoteLevel2, он будет ждать на уровне WinAPI (переключение контекста).
 
И ещё вопрос: если в моей длл вызываются функции Квика через стек Луа (напр., main вызывет getQuoteLevel2), то правильно ли будет перед выходом из моего обработчика события (соответственно, после вызова из main getQuoteLevel2) быстро очистить стек с помощью
Код
lua_settop(L, 0);
Или надо перед вызовом функции Луа из длл сначала делать
Код
n = lua_gettop(L);
И после вызова (перед выходом из обработчика события) делать
Код
lua_settop(L, n);
?
Страницы: 1
Читают тему
Наверх