在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
lua本身是不支持真正的多线程的,但是lua提供了相应的机制来实现多线程。lua执行在一个lua环境中内部叫lua_State。如果我们创建多个lua_State,并且创建一一对应的线程来启动它就基本实现了一个封闭的多线程环境。但是这种环境下lua代码之间没有任何联系,不能共享数据,不能进行同步。因此我们需要建立一套共享数据与同步的机制来。
上面的例子代码主线程中执行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。 例子1
这里例子用来启动一个线程并且传输两个参数,1,2。程序打印1,2 例子2
这里例子先打印hello然后等待1秒在打印world 例子3
这个例子线程启动后,主线程等待1秒,线程起来调用wait等在哪里,当主线程调用notify时,wait返回notify的参数”hello”,”world”,而notify返回wait的参数”hi”,”main thread”。注意wait第一参数是一个布尔值,当成功和notify交互数据时为true否则是false,并且下一个返回值是一个错误提示字符串。程序打印hello,world。 程序可以通过notify,wait对来进行交互数据,并进行同步。 例子4
例子展示线程使用post向主线程函数发送消息,首先主线程创建一个线程,并传递参数”hello”,world”,线程先打印hello world,然后它调用post向主线程发消息”hi”,主线程接收到并打印”hi”,并且返回”done”,然后线程打印done完成整个过程。两个线程在post这个函数是同步的,并且交互数据。 这个模型包括很少的函数,它能然lua具有一定的线程能力。 线程对象有两个函数和一些状态。 在线程内部可以调用下列函数。 |
请发表评论