我有一个主程序(用C语言编写),需要分支到lua_thread(主程序继续运行).lua_thread调用lua_script.lua。这个lua_script包含一个while循环。一个lua变量控制while循环,目前这个循环永远运行。
lua_script.lua
--this loop runs forever, as the exit value is not set yet
a=0
while(a<=0)
do
print("value of a:", a)
end
Run Code Online (Sandbox Code Playgroud)
我的目标是从主程序更改lua变量(a),使其退出此无限循环。一旦该循环结束,它将退出线程并返回到主程序。
main.c
#include <lua.h>
#include <lauxlib.h>
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
void *lua_thread()
{
int status, result;
double sum;
lua_State *L;
L = luaL_newstate();
luaL_openlibs(L);
status = luaL_loadfile(L, "lua_script.lua");
if (status)
{
fprintf(stderr, "Couldn't load file: %s\n", lua_tostring(L, -1));
exit(1);
}
result = lua_pcall(L, 0, 0, 0);
if (result) {
fprintf(stderr, "Failed to run script: %s\n", lua_tostring(L, -1));
exit(1);
}
lua_close(L);
return 0;
}
int main(void)
{
pthread_t p1;
pthread_create(&p1,NULL,lua_thread,NULL);
pthread_join(p1,NULL);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果运行上面的代码
cc -o xcute main.c -I/usr/include/lua5.2 -llua -lm -ldl -pthread
Run Code Online (Sandbox Code Playgroud)
它将陷入无限循环。我想以某种方式控制lua变量并将其从主程序更改为a = 1,以使其脱离无限循环。进行此类测试的原因是,它将确保在主程序退出之前,通过控制lua变量首先退出该线程。请建议如何更改此lua变量,以使其退出while循环。
从另一个线程与正在运行的lua状态进行交互不一定安全,因此,根据打算从C端进行更改的位置,修改脚本的全局变量可能不是有用的想法。
如果要执行此操作,则只需要使用lua C api将相应名称的全局变量设置为适当的lua状态。
另一种想法是创建一个should_exit
全局函数,该函数在每个循环的开始或结束处调用,当返回true时,将导致lua代码变为break
or return
。然后,该函数可以以任何适合线程的方式在C端检查它想要的任何内容。