转自: https://blog.csdn.net/john_crash/article/details/49489609

lua本身是不支持真正的多线程的,但是lua提供了相应的机制来实现多线程。lua执行在一个lua环境中内部叫lua_State。如果我们创建多个lua_State,并且创建一一对应的线程来启动它就基本实现了一个封闭的多线程环境。但是这种环境下lua代码之间没有任何联系,不能共享数据,不能进行同步。因此我们需要建立一套共享数据与同步的机制来。

thread.new("test_thread")

--另一个文件test_thread.lua
local function proc()
print("hello world")
end
return proc
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

上面的例子代码主线程中执行thread.new(“test_thread”)创建一个新的线程,同时创建一个lua_State,在这个lua环境中装入test_thread.lua并启动它返回的函数proc。用c代码为lua实现这样的一个线程库并不难。大概步骤是先创建线程,然后在线程中创建lua_State,这可以使用luaL_newstate()来完成。然后为新环境初始化默认库luaL_openlibs(L)可以完成这个工作,随后你可以注册你的函数与库。以便在这个独立线程可以调用这些库。

下面考虑为thread.new加入更多的参数,第一参数用来指定线程启动的脚本文件,第二参数用来指定一个回调函数,后面依次是传递给线程函数的参数。并且为线程提供两个3个函数。post,wait,sleep。 
post用来回调主线程的回调函数,wait用来阻塞线程等待主线程的通知,sleep休眠一段时间。 
为线程对象提供一个函数notify用来通知等待线程继续执行。

例子1

thread.new("test",1,2)
--test.lua
return function(arg1,arg2)
print(arg1..","..arg2)
end
  • 1
  • 2
  • 3
  • 4
  • 5

这里例子用来启动一个线程并且传输两个参数,1,2。程序打印1,2

例子2

thread.new("test")
--test.lua
return function()
print("hello")
sleep(1000)
print("world")
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这里例子先打印hello然后等待1秒在打印world

例子3

local t = thread.new("test")
sleep(1000)
local b,p1,p2 = t.notify("hello","world")
--test.lua
return function()
local b,p1,p2 = wait("hi","main thread")
print(p1..","..p2)
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这个例子线程启动后,主线程等待1秒,线程起来调用wait等在哪里,当主线程调用notify时,wait返回notify的参数”hello”,”world”,而notify返回wait的参数”hi”,”main thread”。注意wait第一参数是一个布尔值,当成功和notify交互数据时为true否则是false,并且下一个返回值是一个错误提示字符串。程序打印hello,world。

程序可以通过notify,wait对来进行交互数据,并进行同步。

例子4

local t = thread.new("test",function(p)
print(p)
return "done"
end,"hello","world")
--test.lua
return function(p1,p2)
print(p1..","..p2)
local b,r = post("hi")
print(r)
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

例子展示线程使用post向主线程函数发送消息,首先主线程创建一个线程,并传递参数”hello”,world”,线程先打印hello world,然后它调用post向主线程发消息”hi”,主线程接收到并打印”hi”,并且返回”done”,然后线程打印done完成整个过程。两个线程在post这个函数是同步的,并且交互数据。

这个模型包括很少的函数,它能然lua具有一定的线程能力。 
线程对象创建函数 
thread.new( module,callback,… ) 
module指定一个lua文件名,callback一个回调,用来响应线程中post函数。后面可以跟任意多个参数。这些参数将被传输到module返回的函数中。thread.new返回成功返回一个线程对象,失败返回nil,加一个错误字符串。

线程对象有两个函数和一些状态。 
obj:notify(…) 
notify用来通知线程中的wait继续执行,并与wait交互参数。notify成功返回true,后面跟wait传输的参数。失败返回nil,加一个错误字符串。 
obj:join() 
阻塞调用线程指定线程对象结束。 
线程对象具有一个属性.state 可以是下面的值 
“init”,线程还在启动过程中 
“run”,线程真正执行 
“wait”,线程处于wait阻塞状态 
“exit”,线程已经退出

在线程内部可以调用下列函数。 
sleep(ms) 休眠多少毫秒 
wait(…) 线程阻塞,并将参数传递给唤醒它的主线程,成功返回true加notify的参数,失败返回nil,加一个错误字符串。 
post(…) 向主线程的回调函数发送参数,成功将返回true,后面加回调函数的返回。,失败返回nil,加一个错误字符串。

(转)Lua语言实现简单的多线程模型的更多相关文章

  1. 【转】Lua coroutine 不一样的多线程编程思路

    Lua coroutine 不一样的多线程编程思路 Sunday, Apr 26th, 2009 by Tim | Tags: coroutine, Lua 上周末开始看<Lua程序设计> ...

  2. 编译并使用Lua语言

    Lua是一个小巧的脚本语言,该语言设计的目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. 可扩展性.Lua的扩展性非常卓越,可以通过Lua代码或C代码扩展,很多功能可以通过外部库来扩 ...

  3. Java多线程模型

    谈到Java多线程就涉及到多线程的模型及Java线程与底层操作系统之间的关系.正如我们熟知,现代机器可以分为硬件和软件两大块,如图2-5-1-1,硬件是基础,软件提供实现不同功能的手段.而且软件可以分 ...

  4. Lua语言中文手册 转载自网络

    Programming in LuaCopyright ® 2005, Translation Team, www.luachina.net Programming in LuaProgramming ...

  5. Redis 6.0 新特性:带你 100% 掌握多线程模型

    Redis 官方在 2020 年 5 月正式推出 6.0 版本,提供很多振奋人心的新特性,所以备受关注. 码老湿,提供了啥特性呀?知道了我能加薪么? 主要特性如下: 多线程处理网络 IO: 客户端缓存 ...

  6. Redis 新特性:多线程模型解读

    Redis 官方在 2020 年 5 月正式推出 6.0 版本,提供很多振奋人心的新特性,所以备受关注. 主要特性如下: 多线程处理网络 IO: 客户端缓存: 细粒度权限控制(ACL): RESP3  ...

  7. lua Getter&Setter简单实现

    lua是一门简单的语言,不带类和属性封装,但可以使用lua强大的元表模拟实现: class.lua local type = type local rawset = rawset local setm ...

  8. 51CTO专访淘宝清无:漫谈Nginx服务器与Lua语言

    http://os.51cto.com/art/201112/307610.htm 说到Web服务器,也许你第一时间会想到Apache,也许你会想到Nginx.虽然说Apache依然是Web服务器的老 ...

  9. 【转载】COM的多线程模型

    原文:COM的多线程模型 COM的多线程模型是COM技术里头最难以理解的部分之一,很多书都有涉及但是都没有很好的讲清楚.很多新人都会在这里觉得很迷惑,google大神能搜到一篇vckbase上的文章, ...

随机推荐

  1. NOIp2018集训test-10-6/test-10-7 (联考五day1/day2)

    昨天考完月考,明天初赛,dcoi2017级今天终于开始停课准备noip了,大概没有比本弱校停课更晚的学校了吧.本来就够菜了,怕是要凉透哦. DAY1 T1石头剪刀布 据说爆搜随便做,但是我觉得我的O( ...

  2. POJ2516费用流

    目录 目录 (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 目录 题意:传送门 AC代码: #include <iostream> #include <cstdio ...

  3. 日常 java+雅思+训练题1

    今天主要学了一些类似c中的一些语句,java也是一样类似的,只有一些点需要稍微注意一下,一些语句是新增的需要知道. 完完全全新学的知识就是class和instance的区别.如何创建实例.数据的封装. ...

  4. 关于pycharm总是以测试的形式运行程序(nosetest)

    由于各种原因,pycharm有test字段,或者有test的函数时,会莫名奇妙的进入test模式,有时候怎么也跳不出来,害我花了半天时间,坑. 解决办法:直接在菜单栏找Run,选择不带test的进行运 ...

  5. 两个问题: 1、头文件重复包含 2、头文件加了ifndef条件预处理指令为什么还会定义

    第一个问题:编译时重定义 文件1.h void fun1(); struct A { int a char b; };   文件2.h #include"1.h" struct B ...

  6. 面试39 MySQL读写分离

    (1)如何实现mysql的读写分离? 其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去. (2)MySQL主从复制原 ...

  7. rtsp+rtmp多路流媒体播放

    一.前言 之前博主有写过 一篇博文,讲的是使用videojs在谷歌浏览器网页上播放rtmp流媒体,具体可参考我之前的博客:https://www.cnblogs.com/FHC1994/p/99814 ...

  8. 【idea】设置console控制台显示内容大小

    Settings→Editor→General→Console 参考文章:https://blog.csdn.net/weixin_34363171/article/details/93444586

  9. echarts数据变了不重新渲染,以及重新渲染了前后数据会重叠渲染的问题

    1.echarts数据变了但是视图不重新渲染 新建Chart.vue文件 <template>  <p :id="id" :style="style&q ...

  10. uboot 的启动过程及工作原理

    启动模式介绍 大多数 Boot Loader 都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅对于开发人 员才有意义.但从最终用户的角度看, ...