StickyLocking 是一个通用的嵌入式锁管理器,允许锁定任何资源层次结构。可安装的锁模式允许定制锁定系统,以满足几乎所有锁定场景的需求。
文档
粘性锁定提供Locker
类,这是一种高级锁定系统,旨在简化许多不同的并发使用场景,包括简单的读写锁,它为读操作提供共享访问,为写操作提供独占访问,以及用于数据库文件、数据库、页面和行级锁定的更复杂分层锁定方案。
粘性锁定还通过Mutex
类提供低级互斥锁,以保护代码的关键部分。此外,提供了等待条件(Condition
),允许线程等待互斥锁变可用。
互斥锁由Mutex
类提供,而等待条件可以由Condition
类创建。内部,高级组件使用这两个原语实施,粘性工具套件库中的其他模块也使用互斥锁来保护代码的各个关键部分。
分层锁定器
粘性锁定提供Locker
类,这是一种高级锁定系统,旨在简化许多不同的并发使用场景,包括简单的读写锁,它为读操作提供共享访问,为写操作提供独占访问,以及用于数据库文件、数据库、页面和行级锁定的更复杂分层锁定方案。
Locker
使用三个互连的结构,高度可配置于特定的使用案例。
LockMode
定义应用程序将使用的符号,以指定不同资源可以锁定在内的锁定模式。CompatibilityMatrix
定义是否可以为同一资源同时授予两种模式(是共享还是独占)。GroupModeMatrix
定义当一组授予的锁一起授予时,这些锁采用的复合模式。
粘性在这些枚举中预定义了两组的这些值。
SharedExclusiveLockMode
是一个简单的读写系统,用于提供共享读访问和独写访问。
此模式的示例用例可能是为了保护文件或许多文件的访问,这些文件要求所有读取器都能共享文件访问,而写者则被授予独占访问,在它们继续之前,迫使读取器和写者等待写操作的完成。
ExtendedLockMode
是一个扩展模式,包括意向和更新模式,可用于高级数据库类型用例。这个LockMode集合是为了在粘性工具套件库中的其他模型中使用的。
您可以根据自己的使用案例自由定义自己的LockMode集合,从简单的模式结构到更复杂,粘性锁定会适应给定的模式。
定义锁定器行为
Locker
的行为由LockMode
、CompatibilityMatrix
和GroupModeMatrix
定义。这些类型和结构定义了锁定器如何授予锁定模式的请求。
LockMode
是定义锁定特定模式的枚举项。这些模式是用户定义的
锁定模式
锁定模式决定了用于定义锁定可以处于哪些模式的符号。
以下是一个简单的锁定模式定义示例
enum MyLockMode: LockMode {
case S /// Shared
case X /// Exclusive
}
仅凭模式本身只定义了可以使用的符号。必须定义一个 CompatibilityMatrix
和 GroupModeMatrix
来描述各种模式之间的交互方式。
注意:粘性锁定定义了两个内置的
LockMode
枚举及其对应的兼容性和组模式矩阵。一个简单的读写器类型名为SharedExclusiveLockMode
和一个扩展模式名为ExtendedLockMode
,适用于高级数据存储应用。
锁定模式兼容性
锁定模式与另一个请求/线程共享的能力由锁定模式兼容性矩阵决定。对于每个新的锁定请求,矩阵将被检查,如果当前锁定模式和请求模式在矩阵中的值是 true
,则锁定将被并发授予,否则请求将被排队等待。
let compatibilityMatrix: CompatibilityMatrix<MyLockMode>
= [
/* Shared, Exclusive */
/* Shared */ [true, false],
/* Exclusive */ [false, false],
]
锁定组模式
当多个请求兼容并且可以并发授予时,必须计算组的锁定模式。这称为组模式。如果新的请求与组模式兼容,则它可以与组的成员兼容。
Sticky Locking 使用 GroupModeMatrix
来确定当新的请求加入组时组模式。
let groupModeMatrix: GroupModeMatrix<MyLockMode>
= [
/* Requested Shared, Exclusive */
/* Shared */ [S, X],
/* Exclusive */ [X, X],
]
有关锁定器在锁定时的行为更详细的信息和示例,请参阅锁定等待状态 & 授产行为。
内置锁定模式
Sticky Locking 包含两个预定义的 LockMode
枚举及其相关矩阵,用于各种用例。
共享排他锁模式
共享排他锁(又称读写锁或多读锁)允许并发读取操作,同时写操作获取独占访问权限。
这允许多个读者获取共享访问资源,同时阻止所有写者直到没有更多读者读取。写者获取资源独占访问权限,阻止所有其他读者和写者直到操作完成。
定义的模式是
- S - 共享(读取)
- X - 排他(写入)
默认的CompatibilityMatrix
定义如下
请求 | S | X |
---|---|---|
S | ✔ | ✘ |
X | ✘ | ✘ |
默认的GroupModeMatrix
定义如下
请求 | S | X |
---|---|---|
S | S | X |
X | X | X |
扩展锁模式
ExtendedLockMode
是一个预定义的LockMode
实现,可用于复杂数据库类型应用。它定义了一个扩展的锁模式集,包括更新和意图模式。
定义的模式是
- IS - 意向共享
- IX - 意向排他
- S - 共享
- SIX - 共享意向排他
- U - 更新
- X - 排他
默认的CompatibilityMatrix
定义如下
请求 | IS | IX | S | SIX | U | X |
---|---|---|---|---|---|---|
IS | ✔ | ✔ | ✔ | ✔ | ✔ | ✘ |
IX | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ |
S | ✔ | ✘ | ✔ | ✘ | ✔ | ✘ |
SIX | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ |
U | ✔ | ✘ | ✔ | ✘ | ✘ | ✘ |
X | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ |
默认的GroupModeMatrix
定义如下
请求 | IS | IX | S | SIX | U | X |
---|---|---|---|---|---|---|
IS | IS | IX | S | SIX | U | X |
IX | IX | IX | SIX | SIX | X | X |
S | S | SIX | S | SIX | U | X |
SIX | SIX | SIX | SIX | SIX | SIX | X |
U | U | X | U | SIX | U | X |
X | X | X | X | X | X | X |
资源与哈希
Locker
将锁定和解锁任何Hashable
资源,并通过哈希值区分锁定的资源,因此必须注意创建一种哈希算法,以确保相同类型单个对象之间的唯一性以及不同类型之间的哈希值。
如果两个资源哈希到相同的哈希值,并且请求的两种模式不兼容,则冲突可能导致不必要的等待。
还请注意,hashValue不应更改资源。如果hashValue在资源生命周期内发生变化,则锁器会将其视为每次hashValue更改时的不同资源。例如,`Array[]`的哈希值会随着数组中添加或删除的每个元素而改变,因此不能将`Array[]`实例本身用作锁资源。您将必须使用代理资源,例如固定字符串或整数,作为资源标识符。
互斥锁与条件
粘性锁定还通过Mutex
类提供低级互斥锁,以保护代码的关键部分。此外,提供了等待条件(Condition
),允许线程等待互斥锁变可用。
互斥锁由Mutex
类提供,而等待条件可以由Condition
类创建。内部,高级组件使用这两个原语实施,粘性工具套件库中的其他模块也使用互斥锁来保护代码的各个关键部分。
源码和二进制文件
您可以在github上找到最新的源码和二进制文件。
通讯与贡献
- 如果您发现了一个错误,并且可以提供可靠的重现步骤,请提交一个问题。
- 如果您有特性请求,请提交一个问题。
- 如果您想贡献力量
- 分支它! StickyLocking仓库
- 创建您的特性分支:
git checkout -b my-new-feature
- 提交您的更改:
git commit -am '添加一些功能'
- 推送到分支:
git push origin my-new-feature
- 提交拉取请求 :-)
安装
Swift包管理器
StickyLocking支持通过Swift包管理器在所有Apple操作系统变体以及Linux上进行依赖管理。
有关更多信息,请参阅Swift包管理器。
CocoaPods
StickyLocking通过CocoaPods提供。要安装它,只需将以下行添加到Podfile中
pod "StickyLocking"
最低需求
构建环境
平台 | Swift | Swift 构建工具 | Xcode |
---|---|---|---|
Linux | 4.2 | ✔ | ✘ |
macOS | 4.2 | ✔ | Xcode 10.0 |
最低运行版本
iOS | macOS | tvOS | watchOS | Linux |
---|---|---|---|---|
8.0 | 10.10 | 9.0 | 2.0 | Ubuntu 14.04, 16.04, 16.10 |
注意
为了在 Linux 上构建和运行,我们有一个预先配置的 Vagrant 文件,位于 https://github.com/tonystone/vagrant-swift
查看README 以获取说明。
作者
Tony Stone (https://github.com/tonystone)
许可协议
StickyLocking 以 Apache License, Version 2.0 许可协议发布