windows lua 多线程 线程同步

   2023-02-09 学习力0
核心提示:今天在改一个程序,改成部分逻辑用lua写,这个程序是多线程的。将程序中部分逻辑改成lua之后,各种非法访问内存错误,各种奇奇怪怪的问题,不分时间,不分地点的出现崩溃。从调用堆栈来看,基本都是使用lua造成的。在多线程中使用lua_newthread得到的lus_Stat

今天在改一个程序,改成部分逻辑用lua写,这个程序是多线程的。将程序中部分逻辑改成lua之后,各种非法访问内存错误,各种奇奇怪怪的问题,不分时间,不分地点的出现崩溃。从调用堆栈来看,基本都是使用lua造成的。在多线程中使用lua_newthread得到的lus_State仍然有时候程序会崩溃。基本上可以确定为多线程中操作lua 的问题了。

前几天我转载的一篇文章,文章写了关于lua多线程的作法。作法有二

1.每一个线程函数用lua_newthread产生一个新的lua_state 以后对lua操作都用这个lua_state

2.修改lua源码使之成为支持多线程的(修改lua 源代码中lua_lock lua_unlock宏)

对于第2条,那篇文中的例子是用 pthread_mutex_t 来进行线程同步的pthread_mutex_t,我对pthread_mutex_t 不熟,网上一查才知道一般是在linux下C语言进行线程同步用的,在windows下面一般多线程都用CRITICAL_SECTION,和内核对象来进行线程同步的。于是产生了这篇文章。

修改代码如下:

1.global_State加一个成员变量  m_cs

  • typedef struct global_State {
  •   stringtable strt;  /* hash table for strings */
  •   lua_Alloc frealloc;  /* function to reallocate memory */
  •   void *ud;         /* auxiliary data to `frealloc' */
  •   lu_byte currentwhite;
  •   lu_byte gcstate;  /* state of garbage collector */
  •   int sweepstrgc;  /* position of sweep in `strt' */
  •   GCObject *rootgc;  /* list of all collectable objects */
  •   GCObject **sweepgc;  /* position of sweep in `rootgc' */
  •   GCObject *gray;  /* list of gray objects */
  •   GCObject *grayagain;  /* list of objects to be traversed atomically */
  •   GCObject *weak;  /* list of weak tables (to be cleared) */
  •   GCObject *tmudata;  /* last element of list of userdata to be GC */
  •   Mbuffer buff;  /* temporary buffer for string concatentation */
  •   lu_mem GCthreshold;
  •   lu_mem totalbytes;  /* number of bytes currently allocated */
  •   lu_mem estimate;  /* an estimate of number of bytes actually in use */
  •   lu_mem gcdept;  /* how much GC is `behind schedule' */
  •   int gcpause;  /* size of pause between successive GCs */
  •   int gcstepmul;  /* GC `granularity' */
  •   lua_CFunction panic;  /* to be called in unprotected errors */
  •   TValue l_registry;
  •   struct lua_State *mainthread;
  •   UpVal uvhead;  /* head of double-linked list of all open upvalues */
  •   struct Table *mt[NUM_TAGS];  /* metatables for basic types */
  •   TString *tmname[TM_N];  /* array with tag-method names */
  •   CRITICAL_SECTION m_cs; /*windows mutithread */
  • } global_State;
  •  
    反对 0举报 0 评论 0
     

    免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
        本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

    • LUA解析json小demo
      需要修改的json数据gui-config.json{"configs": [{"server": "JP3.ISS.TF","server_port": 443,"password": "58603228","method": "aes-256-cfb","remarks": ""},{"serv
      03-16
    • 第二十三篇:在SOUI中使用LUA脚本开发界面
      像写网页一样做客户端界面可能是很多客户端开发的理想。做好一个可以实现和用户交互的动态网页应该包含两个部分:使用html做网页的布局,使用脚本如vbscript,javascript做用户交互的逻辑。当需求变化时,只需要在服务端把相关代码调整一下,用户即可看到新的
      03-16
    • windows下编译lua源码"><转>windows下编译lua源
      因为之前一直使用 lua for windows 来搭建lua的使用环境,但是最新的 lua for windows 还没有lua5.2,我又想用这个版本的lua,所以被逼无奈只能自己编一下lua源码。首先从 lua的官网 下载你想要使用的lua源码,比如我下载的就是lua5.2。解压后内容如下:
      03-16
    • lua:使用Lua处理游戏数据
      在之前lua学习:lua作配置文件里,我们学会了用lua作配置文件。其实lua在游戏开发中可以作为一个强大的保存、载入游戏数据的工具。 比如说,现在我有一份表单:data.xls用什么工具解析这个Excel文件并将数据载入游戏?我们可以使用Lua来完成这个工作。不过要
      03-16
    • 第1课 - 学习 Lua 的意义
      第1课 - 学习 Lua 的意义
      第1课 - 学习 Lua 的意义1.Lua 简介           (1) 1993年、巴西(2) 小巧精致的脚本语言,大小只有 200K(3) 用标准C语言写成,能够在所有的平台上编译运行(4) 发明的目标是嵌入在C/C++中,为应用程序提供灵活的扩展和定制功能(5) 不适合用于开发
      03-16
    • RedisTemplate 常用API+事务+陷阱+序列化+pipeline+LUA
      RedisTemplate 常用API+事务+陷阱+序列化+pipel
      https://www.jianshu.com/p/7bf5dc61ca06/https://blog.csdn.net/qq_34021712/article/details/79606551https://www.jianshu.com/p/c9f5718e58f0dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/depe
      03-08
    • Nginx动态路由的新姿势:使用Go取代lua nginx路由规则
      Nginx动态路由的新姿势:使用Go取代lua nginx路
      导语: 在Nitro 中, 我们需要一款专业的负载均衡器。 经过一番研究之后,Mihai Todor和我使用Go构建了基于Nginx、Redis 协议的路由器解决方案,其中nginx负责所有繁重工作,路由器本身并不承载流量。 这个解决方案过去一年在生产环境中运行顺畅。 以下是我
      03-08
    • cocos2d-lua 控制台输入Lua指令方便调试
      用脚本进行开发,如果不能实时去输入指令,就丧失了脚本的一大特色,所以对cocos2d-x程序稍微修改下,使其可以直接从控制台读入lua指令,方便调试。1 首先在行首加入lua的引用,如下1 #include "main.h"2 #include "AppDelegate.h"3 #include "cocos2d.h"4 #i
      02-09
    • lua_touserdata
      void *lua_touserdata(lua_State*L,intindex);如果给定索引处的值是一个完整的userdata,函数返回内存块的地址。如果值是一个lightuserdata,那么就返回它表示的指针。否则,返回NULL。例如: 在CCLuaStack::executeFunction()函数中有一段代码是用来获取c++
      02-09
    • Lua 5.2 中文参考手册
      闲来无事,发现Lua更新到了5.2.2,参考手册也更到了5.2,在网上发现只有云风翻译的5.1版,花了几天时间翻译了一些。参考手册有点长,又要随时修改,所以在github上建了项目,有需要的朋友可以看看,同时也欢迎指正。中文手册:Lua 5.2中文参考手册
      02-09
    点击排行