39 lines
1.2 KiB
Markdown
39 lines
1.2 KiB
Markdown
# SpinLock
|
|
|
|
**命名空间**: `XCEngine::Threading`
|
|
|
|
**类型**: `class`
|
|
|
|
**头文件**: `XCEngine/Threading/SpinLock.h`
|
|
|
|
**描述**: 基于 `std::atomic_flag` 的轻量自旋锁。
|
|
|
|
## 概述
|
|
|
|
`SpinLock` 和 `Mutex` 的主要区别不在 API 形状,而在等待策略:
|
|
|
|
- `Mutex` 依赖 OS 互斥量阻塞等待。
|
|
- `SpinLock` 在失败时会一直忙等,不让出 CPU。
|
|
|
|
这类锁通常只适合非常短的临界区,例如极小的元数据更新。商业引擎会保留它,是因为在高频、超短持锁窗口下,系统 mutex 的调度成本可能反而更高。
|
|
|
|
## 当前实现边界
|
|
|
|
- 失败时是空循环忙等,没有回退、没有 `Yield()`、没有 pause 指令。
|
|
- 没有公平性保证。
|
|
- 不是递归锁;同一线程重复进入会自旋死锁。
|
|
- 与 `Mutex` 一样,同时提供了标准 Lockable 风格小写别名。
|
|
|
|
## 公开方法
|
|
|
|
| 方法 | 说明 |
|
|
|------|------|
|
|
| [Lock](Lock.md) | 阻塞自旋直到获得锁;同页也说明 `lock()` 别名。 |
|
|
| [Unlock](Unlock.md) | 释放锁;同页也说明 `unlock()` 别名。 |
|
|
| [TryLock](TryLock.md) | 尝试获得锁;同页也说明 `try_lock()` 别名。 |
|
|
|
|
## 相关文档
|
|
|
|
- [当前模块](../Threading.md)
|
|
- [Mutex](../Mutex/Mutex.md)
|