最简单的多线程lua模型

有几个大前提需要事先声明,免得引入不必要的疑惑。1、lua语言不支持多线程,仅支持协程; 2、多线程可以由C语言创建,在每个线程中创建一个lua state;3、如何在C和lua之间互相调用是关键,本文只涉及到从C语言中调用lua。
      基于以上几个前提,要在多线程中用lua实现事务,首先要解决的问题是用C语言创建多个线程。这件事比较简单,linux编程中常提到。将下面代码拷贝到一个C文件中就可以实现多线程。
#include  
#include  
#include  
#include  
   
void func_1(void* args)  
      while(1){
            printf("this is func_1!\n");  
      }  
}  
   
void func_2(void* args)  
{
      while(1){
            printf("this is func_2!\n");  
      }  
}  
int main()  
{  
pthread_t pid1, pid2;  
   
      if(pthread_create(&pid1, NULL, func_1, NULL))  
      {  
            return -1;  
      }  
   
      if(pthread_create(&pid2, NULL, func_2, NULL))  
      {  
            return -1;  
      }
      while(1){  
            sleep(3);  
      }  
   
      return 0;  
}  

      上面代码演示了如何创建多线程。下面演示如何从C语言中调用lua,假设我们改写上面的thread_1。
void * thread_1(void* args)
{  
      lua_State *L;  
      if(NULL == (L = luaL_newstate()))  
      {  
            perror("luaL_newstate failed");  
            return NULL;
      }
      
      luaL_openlibs(L);
      
      if(luaL_loadfile(L, "./mclient1.lua"))  
      {  
            perror("loadfile failed");  
            return NULL;  
      }
      
        lua_pcall(L, 0, 0, 0);//Lua handles a chunk as the body of an anonymous function with a variable number of arguments. Call it.  
      
        lua_getglobal(L, "upload");  
        lua_pcall(L, 0, 0, 0);
         lua_close(L);  
}

      上例中我们在thread_1中打开mclient1.lua文件,并从中找到upload方法,调用该方法。顺便演示了如何在各个线程中创建不同的lua state.

      那么,为什么要多此一举,把两种语言混合起来呢。有几个前提需要再补充一下。1、多核处理器是既定事实,要充分利用多核优势,多线程或多进程(在linux中这是一回事)是必需的; 2、C语言仍是linux平台上最经济实惠的语言(充分支持;恰如其分地简单); 3、处理业务逻辑时lua的表达能力更强(支持协程和函数式编程),并且lua如C语言一样克制,如非必要,绝不添加。
      为什么不是Java/PHP/Python呢?在充分重视运行效率的前提下,Python的全局锁是最大的障碍;Java/PHP仅支持匿名函数式编程(更不要提协程),表达能力太弱。在多核处理器大行其道的今天,尽管Java/PHP都想转型,无奈历史包襥太重。


      以上示例代码可以在  https://github.com/robotspace/lua_demo  找到相应文件。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南方的小清湖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值