Module xwos.lock.sqlk

XWLUA模块:顺序锁

顺序锁是对自旋锁改良后的锁。主要是对读和写的情况进行区分。

临界区

顺序锁中包含一个自旋锁和一个顺序值。顺序锁将临界区分为三种:

独占写

任何对顺序锁临界区的 操作都是独占的,每次 操作时,会先上锁自旋锁, 然后增加顺序值,离开临界区时也会再次增加顺序值。言外之意,顺序值增加两次,顺序值增加的次数是 偶数

非独占读

如果多个CPU进行的是 只读 操作,它们可以同时进入 非独占读临界区 。 CPU进入非独占读临界区无需获得自旋锁,但需要先测试顺序值是否为 偶数 ,并记录此时的顺序值。 当退出读临界区时,需要再次读取顺序值,并与之前记录的值进行比较:

  • 如果相等,表示读的结果有效;
  • 如果不相等,则表示读的过程中别的CPU进行了写操作,此次的读操作无效。

独占读

如果希望读临界区不会被写操作无效掉,可以使用独占读的方式, 独占读会排斥其他CPU上的独占写和独占读操作,但不会排斥非独占读, 其他CPU依然可以进入非独占读临界区。

to-be-closed 特性

to-be-closed 特性是 Lua-5.4 新引入的特性。拥有 to-be-closed 特性的变量,在离开其作用域时,会自动被 关闭关闭 的行为是由元方法 __close() 来定义的。

XWLUA的顺序锁对象强指针具有 to-be-closed 特性,提供了 Scope Lock 模式 。 当顺序锁对象强指针离开作用域时,会自动解锁关联的顺序锁。

不可重入锁

XWLUA的顺序锁的独占写方式和独占读方式是 不可重入 锁,不可重复上锁。

Functions

new () 新建一个顺序锁


Functions

new ()
新建一个顺序锁

Returns:

    userdata 新的顺序锁对象的强指针 sqlksp

Usage:

    mysqlk = xwos.sqlk.new()
generated by LDoc 1.5.0 Last updated 2024-12-17 12:17:46