Re: when multi threading,"luaL_dostring" crashes in Lua 5.4, but works fine in Lua 5.1
Roberto Ierusalimschy <[email protected]> Mon, 20 Jul 2026 17:51:10 -0300
| Newsgroups | gmane.comp.lang.lua.general |
|---|---|
| Message-ID | <[email protected]> |
Would you mind explaining what this code is meant to show?
> #include "lua-nakh.hxx"
> #include <iostream>
> #include <unistd.h>
> #include <string.h>
>
> void* TheThread(void*);
>
> int SetordaneNakh(lua_State* L) {
> return 0;
> }
>
> int BastaneNakh(lua_State* L) {
> return 0;
> }
>
> static luaL_Reg const lua_nakh_library[] = {
> { "SetordaneNakh", SetordaneNakh },
> { "NakheTaazeh", NakheTaazeh },
> { "BastaneNakh", BastaneNakh },
> { nullptr, nullptr }
> };
>
> static std::string matne_code;
>
> /* code text, shared table */
> int NakheTaazeh(lua_State* L) {
> std::cout<<"L1"<<std::endl;
> matne_code = lua_tolstring(L, -1, nullptr);
> std::cout<<"L2"<<std::endl;
> lua_gettable(L, -1);
> std::cout<<"L3"<<std::endl;
>
> Thread* thread = new struct Thread;
> memset(thread, 0, sizeof(Thread));
> thread->L = luaL_newstate();
> thread->thread_code = &matne_code;
>
> std::cout<<"L4"<<std::endl;
> std::cout<<*thread->thread_code<<std::endl;
> std::cout<<"L5"<<std::endl;
> lua_pushlightuserdata(L, thread);
> std::cout<<"L6: "<<(const void*)thread<<std::endl;
> std::cout<<"L7"<<std::endl;
>
> if(pthread_create(&thread->thread, nullptr, TheThread, thread) != 0) {
> delete thread;
> std::cout<<"Thread error"<<std::endl;
> return -1;
> }
> std::cout<<"L8"<<std::endl;
>
> if(pthread_detach(thread->thread) != 0) {
> delete thread;
> std::cout<<"Thread error detach"<<std::endl;
> return -2;
> }
> std::cout<<"L9"<<std::endl;
>
> return 1;
> }
>
> /*
> if (luaL_loadbuffer(L2, (const char *) matne_code->c_str(),
> matne_code->size(), "thread1-L2") != 0)
> {
> auto error = lua_tostring(L2, -1);
> std::cout<<"loadbuffer() has errors. "<<error<<std::endl;
> }
> lua_pcall(L2, 0, 0, 0);
> std::cout<<"Post()"<<std::endl;
> */
>
> void* TheThread(void* arg) {
> std::cout<<"C1"<<std::endl;
> struct Thread* thread = (struct Thread*) arg;
> std::cout<<"C2: "<<thread->thread_code->c_str()<<std::endl;
> //thread->L = luaL_newstate();
> lua_State *L = thread->L;
> std::cout<<"C3"<<std::endl;
> luaL_openlibs(L);
> std::cout<<"C4"<<std::endl;
> if(luaL_dostring(L, thread->thread_code->c_str()) != 0)//LUA_OK)
> std::cout<<"ERROR"<<std::endl;
> std::cout<<"C5"<<std::endl;
> //if(lua_pcall(L, 0, LUA_MULTRET, 0) != LUA_OK)
> // std::cout<<"ERROR pcall"<<std::endl;
> std::cout<<"C6"<<std::endl;
>
> std::cout<<"TheThread(): "<<thread->thread_code->c_str()<<std::endl;
>
> return nullptr;
> }
>
> int luaopen_nakh(lua_State* L) {
> //luaL_newlib(L, lua_nakh_library);
> luaL_register(L, "lua-nakh", lua_nakh_library);
> return 1;
> }
>
> --
> You received this message because you are subscribed to the Google Groups "lua-l" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
> To view this discussion visit https://groups.google.com/d/msgid/lua-l/CAJtdu10Yi1Cv_grSLLjqDnR9Q86LQHG2MnDhd5Ny5%3DgvxypSGA%40mail.gmail.com.
-- Roberto
--
You received this message because you are subscribed to the Google Groups "lua-l" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
To view this discussion visit https://groups.google.com/d/msgid/lua-l/20260720205110.GB51566%40arraial.inf.puc-rio.br.