Lua Dll на C++

Страницы: 1
RSS
Lua Dll на C++
 
Доброго времени суток. У меня следующий вопрос:
Использую Lua_Api для плюсов. Lua 5.1.

1) Запускаю квик.

2) Квик вызывает скрипт луа и определяет несколько функций запускащихся в разных потоках.
допустим это коллбеки прихода котировок и основной поток - main,
Либо поток main и еще какой либо коллбек из квика работающий в другом потоке

3) Сам скрипт Lua выглядит как вызов Dll, написанной на C++.

   require("My dll");

Внутри Dll я подписываюсь на эти 2 функции (т.е. коллбека от квика) и получается что вызов из терминала, отправляется в Dll и вызываются функции из моей Dll.

3.1) Внутри Dll переменная Lua вынесена в глобальную и к ней подключаются еще нескольку функций, которые могут выполняться, как в каком либо из двух потоков запускаемых квиком, так и в каком либо своем потоке...

----------

Собственно из всего описанного вытек вопрос, нужно ли мне в каждой из функций (включая те что запускаются как коллбеки с программы № 1) делать луа как разделяемый ресурс ? Или же стек сам поймет что его вызывают из другого потока и не будет глючить не чего?

----------
 
 
Стек глючить будет )
У вас будет 2 потока, каждый будет работать со своим стеком. (1 получите в функции main) 2й при вызове экспортируемой из длл функции.
Eсли паралельно будете писать в 1 стек(что можно), то там будет каша. вобщем для каждого потока используйте свой стек.
Если создаете еще какие то свои потоки дополнительно, то уже на сколько хватит фантазии, можно еще 1 стек создать и поток запустить из луа, например.
Потоки вооще я не советую внутри плодить. с синхронизацией потом намучаетесь.
 
А как мне ассоциировать второй созданный луа стек с квиком ? когда я создаю второй стек, то у меня получается так что соощения которые я в него посылаю ("message") в квике не видны уже. Я могу насоздовать сколько угодно стеков путем
Код
lua_State *L_ptr;
L_ptr = lua_open();//Создаем стэк
luaL_openlibs(L_ptr);
Однако это же будут локальные копии внутри библиотеки. И я не смогу через них подписаться на события квика...
 
Цитата
Андрей написал:
А как мне ассоциировать второй созданный луа стек с квиком ? когда я создаю второй стек, то у меня получается так что соощения которые я в него посылаю ("message") в квике не видны уже. Я могу насоздовать сколько угодно стеков путем
Код
  lua_State  * L_ptr;
L_ptr  =  lua_open();//Создаем стэк
luaL_openlibs(L_ptr);  
Однако это же будут локальные копии внутри библиотеки. И я не смогу через них подписаться на события квика...

Похоже понял, однако уточните единственный ли это способ ? Хочется все варианты перебрать.
Код
L_ptr = lua_newthread(L);
Так же скажите пожалуйста где бы взять список всех функций Луа и прочего которые в новом потоке запускаются, и какие в основном? Иначе говоря пренадлежность функция - поток (с точки зрения квика)
 
Цитата
Андрей написал:
Похоже понял, однако уточните единственный ли это способ ? Хочется все варианты перебрать.
Код
  L_ptr  =  lua_newthread(L);
  
Так же скажите пожалуйста где бы взять список всех функций Луа и прочего которые в новом потоке запускаются, и какие в основном? Иначе говоря пренадлежность функция - поток (с точки зрения квика)
Ну ябы выбрал этот вариант. А все варианты... я незнаю для чего вам много потоков) принадлежность к потоку можно проверить GetCurrentThread()
все колбеки - основной поток квика. мэин - вам создали дополнительный, делайте там всю обработку.
у меня там крутиться очередь libuv, вполне удобно.
 
Цитата
Антон написал:
Цитата
Андрей   написал:
Похоже понял, однако уточните единственный ли это способ ? Хочется все варианты перебрать.
Код
    L_ptr   =   lua_newthread(L);
    
Так же скажите пожалуйста где бы взять список всех функций Луа и прочего которые в новом потоке запускаются, и какие в основном? Иначе говоря пренадлежность функция - поток (с точки зрения квика)
Ну ябы выбрал этот вариант. А все варианты... я незнаю для чего вам много потоков) принадлежность к потоку можно проверить GetCurrentThread()
все колбеки - основной поток квика. мэин - вам создали дополнительный, делайте там всю обработку.
у меня там крутиться очередь libuv, вполне удобно.

В итоге сделал так:
1) Выделил L под main и поместил его в класс с мьютексом.
2) L приходящую при инициализации поместил во второй класс с мьютексом.

Все функции внутри main используют класс № 1
Все коллбеки используют L которая у них в параметре приходит, парсят таблицы и передают моим коллбекам как параметр, второй параметр это класс с мьютексом № 2 - его используют все функции внутри других коллбеков.

В итоге получается что если я внутри любого из коллбеков буду организовывать свои потоки то все будет защещино. и с main не как не перекликается.

(я просто заготовку себе делаю что бы ботов не писать на lua)
 
lua_newthread создает Lua thread, которая не является thread (потоком) операционной системы. В документации, когда пишут, что main и OnXXX вызываются на разных потоках (thread), речь идет о настоящих потоках операционной системы.
Самый короткая и полезная формулировка на этот счет: https://stackoverflow.com/questions/17817452/lua-5-2-2-broken-threading-system/17818481#17818481
Возможно, стоит предложить добавить в документацию уточненения, о каких потоках идет речь, если они употребляют слово "поток".

Нет никаких гарантий, что lua_State* для OnXxx будет оставаться тем же, например разработчики, могут начать синхронизировать потоки каким-нибудь изысканным способом, который в итоге поменяет указатель на эту структуру. Поэтому безопаснее не кешировать эти указатели в своих объектах, тем более что это ничего не стоит. Более подробные соображения по этому поводу тут: https://github.com/elelel/qluacpp-tutorial/issues/5
 
Рекомендую проштудировать книгу
Дж.Рихтер Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows
В ней есть ответы на все Ваши вопросы с примерами и готовыми решениями.
Страницы: 1
Читают тему
Наверх