您的位置:首页 > 编程语言 > Lua

最简单的多线程lua模型

2017-02-21 18:23 253 查看
有几个大前提需要事先声明,免得引入不必要的疑惑。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 找到相应文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: