std::recursive_mutex и cинхронизация потоков в Lua

Страницы: Пред. 1 2
RSS
std::recursive_mutex и cинхронизация потоков в Lua
 
Цитата
тот самый написал:
Цитата
Вячеслав   написал:
Да, создаются 2 системных потока, да, в каждом из них выполняется lua_pcall
Всегда, при разговоре на эту тему - разделяйте понятия:
системный поток - это НЕ LUA-поток, а поток ОС
LUA-поток - это не поток ОС. LUA-поток - сродни корутинам.

В самой LUA - никакие системные потоки - не создаются
почему LUA-поток - сродни корутинам.
это и есть корутины других луа потоков я не знаю а Вы?
 
Цитата
Николай Камынин написал:
почему LUA-поток - сродни корутинам.
это и есть корутины других луа потоков я не знаю а Вы?
сумничал, что ль?
 
Цитата
тот самый написал:
Цитата
Николай  Камынин   написал:
почему LUA-поток - сродни корутинам.
это и есть корутины других луа потоков я не знаю а Вы?
сумничал, что ль?
т е сам не знаешь что сказал? Бывает, не переживайте.
 
Цитата
Николай Камынин написал:
Цитата
тот самый   написал:
Цитата
Николай  Камынин   написал:
почему LUA-поток - сродни корутинам.
это и есть корутины других луа потоков я не знаю а Вы?
сумничал, что ль?
т е сам не знаешь что сказал? Бывает, не переживайте.
я сказал - лишь то, что написано. А ты - только троллишь и убиваешь темы.
корутины - это не LUA-потоки. В LUA - корутины используют LUA-потоки - НО! Это не LUA-потоки. И уж тем более - НЕ - потоки ОС.
 
Цитата
тот самый написал:
Цитата
Вячеслав   написал:
Да, создаются 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) от критической секции (мьютекса).
 
Цитата
Вячеслав написал:
в созданном системном потоке в рамках main_lua_thread вызывается Lua-функция main. Без установки обработчиков ошибок это выглядит так: lua_getglobal(main_lua_thread, "main"); lua_pcall(main_lua_thread, 1, 0, 0);
Нет функции редактирования, поэтому исправляюсь:
lua_pcall(main_lua_thread, 0, 0, 0);
Страницы: Пред. 1 2
Читают тему
Наверх