Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何重用lua_newstate创建的lua vm?_Multithreading_Lua - Fatal编程技术网

Multithreading 如何重用lua_newstate创建的lua vm?

Multithreading 如何重用lua_newstate创建的lua vm?,multithreading,lua,Multithreading,Lua,有时我们需要将整个lua vm用作工作单元,例如调度 操作系统线程之间的工作单元。然而,这是一个有点开销在最后 lua_newstate和lua_close。之后重用vm是否可行 清理(保持沙箱) 我的简单想法是在vm内创建一个工作线程(为沙箱创建新的_ENV),恢复该线程以完成工作,然后删除该线程并将vm放入空闲池以供以后重用 我写了一个简单的程序来验证它 test.c: $ gcc -o test test.c -llua -lm -ldl $ time ./test state rea

有时我们需要将整个lua vm用作工作单元,例如调度 操作系统线程之间的工作单元。然而,这是一个有点开销在最后 lua_newstate和lua_close。之后重用vm是否可行 清理(保持沙箱)

我的简单想法是在vm内创建一个工作线程(为沙箱创建新的_ENV),恢复该线程以完成工作,然后删除该线程并将vm放入空闲池以供以后重用

我写了一个简单的程序来验证它

test.c:

$ gcc -o test test.c -llua -lm -ldl

$ time ./test state

real    0m21.470s
user    0m20.472s
sys 0m0.980s

$ time ./test

real    0m14.933s
user    0m14.036s
sys 0m0.872s
#包括
#包括
#包括
int main(int argc,char*argv[])
{
int i=0;
常数int max=100000;
如果(argc>1){
对于(i=0;i
测试。lua:

$ gcc -o test test.c -llua -lm -ldl

$ time ./test state

real    0m21.470s
user    0m20.472s
sys 0m0.980s

$ time ./test

real    0m14.933s
user    0m14.036s
sys 0m0.872s
本地总计=0
对于i=010000-1 do
总计=总计+i
结束
返回总数
输出:

$ gcc -o test test.c -llua -lm -ldl

$ time ./test state

real    0m21.470s
user    0m20.472s
sys 0m0.980s

$ time ./test

real    0m14.933s
user    0m14.036s
sys 0m0.872s
简单的重用似乎只节省了30%的CPU,这远远不够完美


有更好的解决方案吗?

为什么每次都要加载脚本?为什么不加载它一次并在循环中调用任何需要的函数呢?还有,为什么要使用协同程序?因为每个工作单元都是独立的,有不同的输入脚本,它们不应该相互共享任何内容。可以将VM/CONDOTIN视为逻辑容器,可以重新加载逻辑,并重新使用容器。协同程序是以廉价的方式重用vm的想法之一。协同程序是standboxing的关键!在lua>=5.2中,除了registry和string intern表(默认情况下,_ENV指的是全局表,而全局表又是由lua_RIDX_GLOBALS索引的注册表中的一个值)之外,协同程序之间不共享任何内容。请看上面的代码,每次我重用vm时,我都会用新表替换新corotuine的_ENV,恢复之后,coroutine和表都会被删除,这就是我的意思。