Lua知识点3_线程和状态

本文介绍了Lua中的协作式多线程,强调其非抢占式特性,以及线程如何通过lua_State对象表示。文章详细阐述了如何创建、管理和使用线程,包括lua_newthread、lua_resume等函数的用法,并通过示例代码展示了如何在C++中调用Lua脚本进行协同程序的执行。此外,还提到了Lua状态的概念,每个状态是独立的,不共享数据,错误不会互相影响,且状态间通信需要辅助代码实现。
摘要由CSDN通过智能技术生成
以下是在cocos2dx-3.10 lua中


1.多线程
Lua不支持真正的多线程,而是一种协作式的多线程,彼此之间协作完成,并不是抢占完成任务,由于这种协作式的线程,
因此可以避免由不可预知的线程切换所带来的问题;另一方面,Lua的多个状态之间不共享内存,这样便为Lua中的并发
操作提供了良好的基础。


从C API的角度来看,将线程想象成一个栈可能更形象些。从实现的观点来看,一个线程的确就是一个栈。每个栈都保留
着一个线程中所有未完成的函数调用信息,这些信息包括调用的函数、每个调用的参数和局部变量。也就是说,一个栈拥
有一个线程得以继续运行的所有信息。因此,多个线程就意味着多个独立的栈。


当调用Lua C API中的大多数函数时,这些函数都作用于某个特定的栈。当我们调用lua_pushnumber时,就会将数字
压入一个栈中,那么Lua是如何知道该使用哪个栈的呢?答案就在类型lua_State中。这些C API的第一个参数不仅表示
了一个Lua状态,还表示了一个记录在该状态中的线程。


只要创建一个Lua状态,Lua就会自动在这个状态中创建一个新线程,这个线程称为“主线程”。主线程永远不会被回收。
当调用lua_close关闭状态时,它会随着状态一起释放。调用lua_newthread便可以在一个状态中创建其他的线程。
lua_State * lua_newthread ( lua_State * L ) ;


这个函数返回一个lua_State指针,表示新建的线程。它会将新线程作为一个类型为“thread”的值压入栈中。如果
我们执行了:
L1 = lua_newthread ( L ) ;


现在,我们拥有了两个线程L和L1,它们内部都引用了相同的Lua状态。每个线程都有其自己的栈。新线程L1以一个
空栈开始运行,老线程L的栈顶就是这个新线程。


除了主线程以外,其它线程和其它Lua对象一样都是垃圾回收的对象。当新建一个线程时,线程会压入栈,这样能确
保新线程不会成为垃圾,而有的时候,你在处理栈中数据时,不经意间就把线程弹出栈了,而当你再次使用该线程时,
可能导致找不到对应的线程而程序崩溃。为了避免这种情况的发生,可以保持一个对线程的引用,比如在注册表中保
存一个对线程的引用。


当拥有了一个线程以后,我们就可以像主线程那样来使用它,以前博文中提到的对栈的操作,对这个新的线程都适用。
然而,使用多线程的目的不是为了实现这些简单的功能,而是为了实现协同程序。


为了挂起某些协同程序的执行,并在稍后恢复执行,我们可以使用lua_resume函数来实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值