转自: 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. 强大的pdf文件操作小工具——PDFtk的小白用法 【转载】

    转载出处https://www.cnblogs.com/basterdaidai/p/6204518.html 前言 作为程序员,大家都知道的,总是会被技术小白问各种跟编程没什么关系的硬件.软件问题. ...

  2. (转)在Source Insight中看Python代码

    http://blog.csdn.net/lvming404/archive/2009/03/18/4000394.aspx SI是个很强大的代码查看修改工具,以前用来看C,C++都是相当happy的 ...

  3. idea中选中了一个变量名,会高亮显示位于别的地方的这个变量名,那么怎么修改其他地方的高亮颜色

  4. java 8 lambda函数

    1 为什么要引进lambda函数 可以简化编码,将事情更多的交给编译器,让编译器帮我们推断我们写的代码的完整形式. 2 lambda函数的语法 2.1 -> (arg1, arg2) -> ...

  5. python中字典排序

    一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠倒的:相反的:(判决等)撤销的 print list(reversed(['dream','a ...

  6. python 在机器学习中应用函数

    浅述python中argsort()函数的用法 (1).先定义一个array数据 1 import numpy as np 2 x=np.array([1,4,3,-1,6,9]) (2).现在我们可 ...

  7. 一点响应式Web设计与实现思路

    摘要: 是否还在为你的应用程序适配PC端,移动端,平板而苦苦思索呢,是否在寻找如何一套代码适配多终端方式呢,是否希望快速上手实现你的跨终端应用程序呢,是的话,那就看过来吧,本文阐述响应式UI设计相关理 ...

  8. 02->交互式图形学--用glut库实现Sierpinski镂垫

    Sierpinski图形是一类有趣的图形,本文结合交互式图形学教材,讲解Sierpinski镂垫图形生成,作为入门图形学编程的第一课.为了简便,本文就2D来进行讨论.实验环境见01 算法 主要是根据随 ...

  9. Flutter 类似viewDidAppear 的任务处理

    前言 在任务之中 ,有些实时任务比较重的需求,需要在类似 iOS viewDidAppear 里面执行数据请求任务,如:上一个页面返回pop 后执行网络请求任务.在flutter中如何实现呢?  目前 ...

  10. iOS逆向系列-动态调试

    Xcode调试App原理 Mac安装了Xcode Xcode的安装包中包含了debugserver 可执行类型的Mach-O文件,iPhone第一次连接Xcode调试会将Xcode中的debugser ...