最简单的多线程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 找到相应文件。
基于以上几个前提,要在多线程中用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 找到相应文件。
相关文章推荐
- Lua语言实现简单的多线程模型
- 一种简单有效的3D模型的动画多线程方案
- 简单的多线程流水线模型(一)
- 一种简单有效的3D模型的动画多线程方案
- 简单的多线程流水线模型(二)
- 【Java 多线程】简单生产者消费者模型
- 一种简单有效的3D模型的动画多线程方案
- 线程模型、pthread 系列函数 和 简单多线程服务器端程序
- 4---能正常运行的多线程最简单模型
- java 简单的文件上传下载服务器模型(IO + 多线程)
- linux网络编程之posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序
- C/S模型 多线程服务器实现简单计算工作并回馈客户端
- 一种简单有效的3D模型的动画多线程方案
- 一种简单有效的3D模型的动画多线程方案
- posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序
- 简单直观-实战体会Java多线程编程的精要
- 从一个简单的例子看UI多线程处理(基于eclipse的SWT组件)
- 简单直观-实战体会Java多线程编程的精要
- delphi多线程程序示例(与.net一样简单)
- Linux下的简单生产、消费模型的实现(上)