详解在多线程中使用Lua方法

移动开发 iOS
如果不能在多线程中使用Lua ,这将是Lua一个很大的限制。但是有什么办法解决这个问题呢?所幸的是lua 提供了多线程支持函数,可以用来解决多线程的问题。

 

多线程中使用Lua方法是本文要介绍的内容,大家知道,直到现在的lua 5.1,Lua中的函数都没有提供线程安全实现。所以如果在多线程中访问lua_State 会产生无法预料的结果。但是现在的应用软件一般都要求采用多线程,来满足应用是的一些要求。

如果不能在多线程中使用Lua ,这将是Lua一个很大的限制。但是有什么办法解决这个问题呢?所幸的是lua 提供了多线程支持函数,可以用来解决多线程的问题。这五个函数原型分别如下:

  1. int lua_newthred(lua_State* L)  
  2. int lua_resume(lua_State* L, int nargs)  
  3. int lua_yield(lua_State* L int nresults)  
  4. void lua_lock(lua_State* L)  
  5. void lua_unlock(lua_State* L) 

我们借助以上五个函数,再加上线程同步。基本上能解决Lua在多线程中的应用问题。以上五个函数的具体用法请参考lua开发指南。在一下例出相应代码,以供大家参考。

1、多线程使用时发生Lua栈出错问题,

产生问题的原因:多线程使用同一个lua_State 会导致lua 栈发生错乱,引起各种错误。

解决方法:可以采用lua_newthread 函数来生成一份新的栈,防止栈访问冲突。

解决方法代码示例如下(在实际使用中需要更小心的维护lua栈访问冲突,调用lua_newthread 时也需要同步机制来保护,需要实现lua_lock、lua_unlock ,以确保多线程访问时不会冲突。 ):

  1.  lua_State* L = lua_newthread(luaMain)  
  2.   ...  
  3.  lua_pushstring(L, str);  
  4. ...  
  5. lua_resume(L, n) 

2、使Lua 脚本暂停执行,但又防止宿主程序主线程被卡住问题。

解决办法:可以在宿主程序中调用lua_yield函数来暂停脚本执行,待宿主程序执行任务完成的调用lua_resume 来恢复lua脚本的继续执行。

示例代码如下:

  1. C++:  
  2. int show_dialog(void)  
  3. {  
  4. ....  
  5.    lua_pushnumber(L, IDOK);  
  6.     return lua_yield(L, n); \\lua_yield函数必须放在return 语句后面。  
  7. }  
  8. int end_dialog(void)  
  9. {  
  10. ...  
  11. int ret = lua_resume(L, 0);  
  12. if(ret == LUA_YIELD)  
  13. {  
  14.     int id = lua_tonumber(L, -1);  
  15. }  
  16. return 2;  
  17. }  
  18. Lua:  
  19. ret = show_dialog()  
  20. if ret == 0 then  
  21. end 

小结:详解在多线程中使用Lua方法的内容介绍完了,希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 来源: 互联网
相关推荐

2024-01-07 17:29:10

编程语言线程Rust

2013-12-13 17:21:14

Lua脚本语言

2009-10-13 09:56:13

.NET多线程程序

2011-08-10 10:18:22

iPhone多线程线程

2024-03-06 08:40:16

ReactJavascriptUI交互

2011-08-23 09:56:52

UnicodeLua

2011-08-29 15:10:19

JAVALua 脚本

2011-08-16 10:35:59

Objective_C私有方法

2010-04-14 09:20:26

.NET多线程

2011-06-30 10:50:39

Qt OpenCV

2012-04-23 10:30:38

Hadoop

2011-06-28 10:03:37

Qt OpenCV qmake

2009-06-29 18:08:51

Java多线程join方法

2011-08-29 16:16:22

Lua函数多线程

2011-08-31 16:22:51

LUA多线程

2009-06-29 18:32:52

Java多线程Synchronize

2009-04-27 13:15:04

多线程方法run()

2011-08-23 17:52:39

LUAWeb 开发

2022-05-20 10:20:17

Spring事务MyBatis

2015-04-17 16:44:22

swiftOC
点赞
收藏

51CTO技术栈公众号