转自: 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. lsof 详解

    lsof常用参数 lsof 如果不加任何参数,就会打开所有被打开的文件,建议加上一下参数来具体定位lsof -i 列出所有网络连接lsof -i tcp 列出所有tcp连接信息lsof -i udp  ...

  2. IDEA下spring boot项目打包war包部署外部tomcat问题

    第一步,修改配置pom.xml文件 <packaging>war</packaging> <dependency> <groupId>org.sprin ...

  3. NX二次开发-UFUN替换组件UF_ASSEM_use_alternate

    NX9+VS2012 #include <uf.h> #include <uf_ui.h> #include <uf_assem.h> #include <u ...

  4. 探索NDIS HOOK新的实现方法(1)

    NDIS HOOK是专业级防火墙使用的一种拦截技术,NDIS HOOK的重点是如何获得特定协议对应NDIS_PROTOCOL_BLOCK指针,获得了该指针,接下来就可以替换该协议所注册的收发函数,而达 ...

  5. ionic-CSS:ionic checkbox(复选框)

    ylbtech-ionic-CSS:ionic checkbox(复选框) 1.返回顶部 1. ionic checkbox(复选框) ionic 里面的 Checkbox 和普通的 Checkbox ...

  6. springmvc静态资源;mvc:default-servlet-handler后Controller失效

    springmvc静态资源;mvc:default-servlet-handler后Controller失效 web.xml配置<url-pattern>/</url-pattern ...

  7. python爬取文件时,内容为空

    解决方式: img_res = requests.get(src,headers=header)在header中加上referer防盗链加上防盗链header的例子: header = {" ...

  8. CVE-2017-3248简单复现

    我是这样操作的 目标跟windows在一个段,linux是另一个段的,我的虚拟机 windows主机上 `java -cp ysoserial.jar ysoserial.exploit.JRMPLi ...

  9. 常用sign算法

    所有参数包括appkey或者token拼接成&key=value格式 转小写 正序排序 MD5后得到sign

  10. scrapy不抓取重复的网页解决办法

    1.scrapy爬虫遇到一个问题,有时候会对一个网页重复爬取提取不同的数据,这时候会发现,后面的那个重复爬取scrapy直接终止了. 原因: scrapy 的request逻辑里面  dont_fil ...