Цитата |
---|
тот самый написал:
Цитата |
---|
Вячеслав написал: Да, создаются 2 системных потока, да, в каждом из них выполняется lua_pcall |
Всегда, при разговоре на эту тему - разделяйте понятия: системный поток - это НЕ LUA-поток, а поток ОС LUA-поток - это не поток ОС. LUA-поток - сродни корутинам.
В самой LUA - никакие системные потоки - не создаются |
Ок, разделяю:
Есть системный поток (основной поток процесса info.exe). При запуске Lua-скрипта:
- создаётся lua_State *global = luaL_newstate();
- выполняется код Lua-скрипта (по-простому - всё что вне декларций функций)
- вызывается OnInit(имя_файла_скрипта)
- создаётся новый Lua поток lua_State *main_lua_thread = lua_newthread(global);
- созданный Lua-поток помещается в LUA_REGISTRYINDEX (luaL_ref), чтобы он не разрушался, и чтобы иметь возможность вызывать callback'и в основном Lua-потоке global.
- создаётся новый системный поток
- в созданном системном потоке в рамках main_lua_thread вызывается Lua-функция main. Без установки обработчиков ошибок это выглядит так: lua_getglobal(main_lua_thread, "main"); lua_pcall(main_lua_thread, 1, 0, 0);
- в процессе работы всё просто. Когда терминал хочет вызвать callback, он выполняет: lua_getglobal(global, "OnQuote"); lua_push... lua_pcall(global, *кол-во аргументов*, 0, *обработчик ошибок*); в случае ошибки, предполагаю, что терминал принудительно останавливает новый системный поток и останавливает выполнение скрипта. В этом случае возможна утечка памяти/ресурсов (ресурсов, например, если были загружены .dll с помощью require).
- когда в новом системном потоке происходит выход из ф-ции lua_pcall, новый системный поток завершается
- выполняется закрытие lua_close(global). main_lua_thread Lua-поток разрушится сам, т.к. он хранится в REGISTRYINDEX в global lua_State.
Цитата |
---|
тот самый написал: 1. по понятным причинам, не ручаюсь на 100% но, код работы с коллбеками, завязан на отдельный LUA-поток в контексте одной виртуальной машины. Другой поток (и физический и LUA-поток) - это, ещё один коллбек - функция "main". Таким образом, никаких проблем там - уже давно не возникает. |
Можно ещё разок. Я не понял, что Вы имеете ввиду.
Цитата |
---|
тот самый написал: 2. любой доступ к глобальным переменным - обёрнут критическими секциями. Это уже было сказано Михаилом Булычевым. Строго говоря, такие вопросы Вам - и надо ему задавать, а не "бодаться" с другими. |
Случайно нет ссылки на то, что этот человек сказал и кто этот человек?
Цитата |
---|
Николай Камынин написал: все решается с помощью одного event, функций sinsert и sremove и использованием глобальных переменных. |
Мне сложно Вам отвечать, т.к., возможно, Вы либо не понимаете, как устроен многопоточный доступ к Си данным lua_State, либо, в чём отличие Event (созданного с помощью CreateEvent) от критической секции (мьютекса).