从C更改lua变量

bis*_*nux 5 c lua pthreads

我有一个主程序(用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循环。

Eta*_*ner 5

从另一个线程与正在运行的lua状态进行交互不一定安全,因此,根据打算从C端进行更改的位置,修改脚本的全局变量可能不是有用的想法。

如果要执行此操作,则只需要使用lua C api将相应名称的全局变量设置为适当的lua状态。

另一种想法是创建一个should_exit全局函数,该函数在每个循环的开始或结束处调用,当返回true时,将导致lua代码变为breakor return。然后,该函数可以以任何适合线程的方式在C端检查它想要的任何内容。