线程共享表用于读写多线程共享值,以简化 thread.get,thread.set 的操作。
线程共享表本质上只是线程共享数据代理对象,自身并不存储这些线程共享数据。 线程共享表(thread.table )基本规则: 使用 thread.table 的示例 aardio 代码:用法说明
//注意先导入 thread.table 库再创建 thread.table 对象。
var thrdTable = thread.table()
//用下标读写键值,键名与对象的属性、函数名同名不会冲突。
thrdTable["b"] = 34;
thrdTable["c"]= 56;
//可以读写普通表,但子表并不是线程共享表。
thrdTable["d"] = {};
//每次读取 thrdTable.d 都会得到新的副本
var localData = thrdTable["d"];
//修改 localData 不会自动会同步到线程共享资源。
localData.tab = { name = "name" }
//下面这样只是修改子表的临时副本,子表不是线程共享表
thrdTable.d.tab = { name = "name" }
//只有修改线程共享表的直接成员,才会自动同步到线程共享资源
thrdTable["d"] = localData;
//注意 # 操作符不适合用于线程共享表
var len = #thrdTable
//应当用 len 函数或 length 属性获取共享数组长度
len = thrdTable.len(); // 也可以用 thrdTable.
//线程共享表可作为线程函数的参数直接传入其他线程函数。
thread.invoke(
function(tab){
var localData = thrdTable["d"];
},thrdTable
)
创建多线程共享表,返回对象可作为参数传入其他线程函数。
可选使用参数 @1 指定线程共享变量名,
省略参数 @1 则自动分配线程共享变量名。
thread.var 以及 thread.table 分配的线程共享变量名上限为
:0x3FFFFFFFFFFFFC0000000000000 个。
应及时调用线程共享表的 release 函数释放对象与空闲的共享变量名
可选用参数 @2 指定是否要重新初始化并创建新的共享表。
如果未指定共享表名称,则总是重新初始化共享表
多线程共享表。
这是标准库模块,需要导入才能用。
线程共享表用于读写多线程共享值,以简化 thread.get,thread.set 的操作。
注意线程共享表本质上只是线程共享数据代理对象,自身并不存储这些线程共享数据。
- 每次读取共享表的成员都会在当前线程复制一个新的副本。
- 写入直接表的直接成员才会写入线程共享资源。
- 不要将普通表直接覆盖替换线程共享表自身,应当存为子表
- 线程共享表的子表并非也是共享表,修改子表的成员并不能更新父级线程共享表。
- 线程共享表的下标操作符被重载为读写共享资源,不会与共享表的同名方法、属性发生冲突。
- 线程共享表的成员操作符虽然也能读写共享资源,但要避免覆盖同名的共享表方法与属性。
- 获取共享数组长度应当用线程共享表对象的 len 函数而不是 # 操作符。
创建多线程共享数组,返回对象可作为参数传入其他线程函数。
可选使用参数 @1 指定线程共享变量名,
省略参数 @1 则自动分配线程共享变量名。
thread.var 以及 thread.table 分配的线程共享变量名上限为
:0x3FFFFFFFFFFFFC0000000000000 个。
应及时调用线程共享表的 release 函数释放对象与空闲的共享变量名
可选用参数 @2 指定是否要重新初始化并创建新的共享表。
如果未指定共享表名称,则总是重新初始化共享表
使用索引下标 [] 可读写共享表全部键值。
使用成员属性操作符 . 则先访问对象的函数成员。
不要拿普通表直接覆盖线程共享表本身,应存为共享表里的成员表。
因为每次读取共享表的成员都会在当前线程复制一个新的副本。
所以要修改线程共享表里面的子表,必须先读取到当前线程的本地变量。
修改共享表中参数@1指定名字的字段值。
旧的字段值必须为 null 或数值。
如果旧值为 null 则直接赋值为参数@2。
如果旧值为数值则增加参数@2指定的数值。
追加一个或多个数组到线程共享表,
此函数内部使用table.append实现,规则相同,
但无返回值
清空共享表中的所有值
拼接多个table对象
获取table成员总数
for k,v in threadTableObject.each() {
/*遍历表对象,k 为当前键,v 为当前值*/
}
读取成员值
在指定表查找并返回成员
插入元素到table头部
插入元素到指定位置
返回table对象左侧开始返回指定个数的元素。
返回 table 对象的数组元素长度,不含数组成员则返回 0。
length 属性也可以返回数组长度,但表不是数组类型时返回 null。
# 操作符仅用于计算表对象自身存储的数组成员,
但线程共享仅仅是共享表的代理表,并不存储真正的共享数据。
返回指定元素长度
数组返回数组长度,表不含数组成员且不是数组类型时返回 null。
可使用 thread.table.array 创建数组类型的线程共享表。
# 操作符仅用于计算表对象自身存储的数组成员,
但线程共享仅仅是共享表的代理表,并不存储真正的共享数据。
共享表名字,不要改动
迭代获取table的下一个键值对元素
获取table的第一个键值对元素
在顺序数组尾部弹出一个或多个元素并作为返回值
在顺序数组尾部压入一个或多个元素,返回数组大小
在顺序数组尾部压入多个元素,返回数组大小
返回table数组的最小索引,最大索引
min,max=tab.range();
释放线程共享表,释放后不应当再使用
在table头部移除元素
在表中指定位置移除元素
table数组倒序排列。
返回table对象右侧开始返回指定个数的元素
写入成员值
参数一指定表内名字空间路径,如果不存在则则创建此表内名字空间,
支持索引操作符,可以使用[]空索引实现在数组尾部添加值
参数二指定需要设置的值,如果不指定则创建空表并赋值
自数组头部移除并返回指定个数成员,
参数默认为1
排序
排序,comProc指定用于比较元素大小的函数
获取table的字符串表达式
返回表中所有的元素
a,b,c,d,e = tab.unpack();
插入一个或多个元素到数组头部,返回数组长度