顺序锁的结构体非常小,因此不分别提供静态初始化与动态创建的方法。
共享读
void foo()
{
do {
共享读临界区
}
xwsq_t readBegin()
开启共享读临界区
bool readRetry(xwsq_t start)
关闭共享读临界区,并检查是否需要重试
顺序锁的RAII机制守卫
顺序锁不同的锁模式具有不同的RAII机制守卫:
Seqlock::RdexLkGrd : 独占读普通上锁模式
- 构造函数关闭当前CPU调度器的抢占,然后上锁顺序锁。 上锁失败会自旋等待,直到上锁成功为止。
- 析构函数解锁顺序锁,开启当前CPU调度器的抢占。
- 示例
Seqlock::TryRdexLkGrd : 独占读普通尝试上锁模式
- 构造函数关闭并保存本地CPU的中断,关闭当前CPU调度器的抢占,上锁顺序锁。 上锁失败会自旋等待,直到上锁成功为止。
- 析构函数解锁顺序锁,开启当前CPU调度器的抢占, 用保存的中断标志恢复本地CPU的中断。
- 示例
void foo()
{
{
if (
XWOK == grd.getRc()) {
} else {
}
}
}
Seqlock::RdexLkThGrd : 独占读CPU中断上锁模式
- 构造函数关闭并保存本地CPU的中断,关闭当前CPU调度器的抢占,上锁顺序锁。 上锁失败会自旋等待,直到上锁成功为止。
- 析构函数解锁顺序锁,开启当前CPU调度器的抢占, 用保存的中断标志恢复本地CPU的中断。
- 示例
void foo()
{
{
进入临界区
}
}
独占读CPU中断上锁模式下的顺序锁RAII机制守卫
Seqlock::TryRdexLkThGrd : 独占读CPU中断尝试上锁模式
- 构造函数关闭并保存本地CPU的中断,关闭当前CPU调度器的抢占,上锁顺序锁。 上锁失败不会自旋等待,会开启当前CPU调度器的抢占, 用保存的中断标志恢复本地CPU的中断,并在
mRc
中返回 -EAGAIN
- 析构函数解锁顺序锁,开启当前CPU调度器的抢占, 用保存的中断标志恢复本地CPU的中断。
- 示例
void foo()
{
{
if (
XWOK == grd.getRc()) {
} else {
}
}
}
独占读CPU中断尝试上锁模式下的顺序锁RAII机制守卫
Seqlock::RdexLkBhGrd : 独占读中断底半部上锁模式
- 构造函数关闭当前CPU调度器的抢占,关闭本地CPU的中断底半部,然后上锁顺序锁。 上锁失败会自旋等待,直到上锁成功为止。
- 析构函数解锁顺序锁,开启本地CPU的中断底半部,开启当前CPU调度器的抢占。
- 示例
void foo()
{
{
进入临界区
}
}
独占读中断底半部上锁模式下的顺序锁RAII机制守卫
Seqlock::TryRdexLkBhGrd : 独占读中断底半部尝试上锁模式
- 构造函数关闭当前CPU调度器的抢占,关闭本地CPU的中断底半部, 然后尝试上锁顺序锁。 上锁失败不会自旋等待,会开启当前CPU调度器的抢占,开启本地CPU的中断底半部, 并在
mRc
中返回 -EAGAIN
。
- 析构函数解锁顺序锁,开启本地CPU的中断底半部,开启当前CPU调度器的抢占。
- 示例
void foo()
{
{
if (
XWOK == grd.getRc()) {
} else {
}
}
}
Seqlock::RdexLkIrqsGrd : 独占读部分中断上锁模式
- 构造函数关闭并保存模板参数列表内的中断,关闭当前CPU调度器的抢占,上锁顺序锁。 上锁失败会自旋等待,直到上锁成功为止。
- 析构函数解锁顺序锁,开启当前CPU调度器的抢占, 用保存的中断标志恢复模板参数列表内的中断。
- 示例
Seqlock::TryRdexLkIrqsGrd : 独占读部分中断尝试上锁模式
- 构造函数关闭并保存模板参数列表内的中断,关闭当前CPU调度器的抢占,上锁顺序锁。 上锁失败不会自旋等待,会开启当前CPU调度器的抢占, 用保存的中断标志恢复模板参数列表内的中断, 并在
mRc
中返回 -EAGAIN
。
- 析构函数解锁顺序锁,开启当前CPU调度器的抢占, 用保存的中断标志恢复模板参数列表内的中断。
- 示例
void foo()
{
{
if (
XWOK == grd.getRc()) {
} else {
}
}
}
独占读部分中断尝试上锁模式下的顺序锁RAII机制守卫
Seqlock::WrLkGrd : 独占写普通上锁模式
- 构造函数关闭当前CPU调度器的抢占,然后上锁顺序锁。 上锁失败会自旋等待,直到上锁成功为止。
- 析构函数解锁顺序锁,开启当前CPU调度器的抢占。
- 示例
Seqlock::TryWrLkGrd : 独占写普通尝试上锁模式
- 构造函数关闭并保存本地CPU的中断,关闭当前CPU调度器的抢占,上锁顺序锁。 上锁失败会自旋等待,直到上锁成功为止。
- 析构函数解锁顺序锁,开启当前CPU调度器的抢占, 用保存的中断标志恢复本地CPU的中断。
- 示例
void foo()
{
{
if (
XWOK == grd.getRc()) {
} else {
}
}
}
Seqlock::WrLkThGrd : 独占写CPU中断上锁模式
- 构造函数关闭并保存本地CPU的中断,关闭当前CPU调度器的抢占,上锁顺序锁。 上锁失败会自旋等待,直到上锁成功为止。
- 析构函数解锁顺序锁,开启当前CPU调度器的抢占, 用保存的中断标志恢复本地CPU的中断。
- 示例
void foo()
{
{
进入临界区
}
}
独占写CPU中断上锁模式下的顺序锁RAII机制守卫
Seqlock::TryWrLkThGrd : 独占写CPU中断尝试上锁模式
- 构造函数关闭并保存本地CPU的中断,关闭当前CPU调度器的抢占,上锁顺序锁。 上锁失败不会自旋等待,会开启当前CPU调度器的抢占, 用保存的中断标志恢复本地CPU的中断,并在
mRc
中返回 -EAGAIN
- 析构函数解锁顺序锁,开启当前CPU调度器的抢占, 用保存的中断标志恢复本地CPU的中断。
- 示例
void foo()
{
{
if (
XWOK == grd.getRc()) {
} else {
}
}
}
独占写CPU中断尝试上锁模式下的顺序锁RAII机制守卫
Seqlock::WrLkBhGrd : 独占写中断底半部上锁模式
- 构造函数关闭当前CPU调度器的抢占,关闭本地CPU的中断底半部,然后上锁顺序锁。 上锁失败会自旋等待,直到上锁成功为止。
- 析构函数解锁顺序锁,开启本地CPU的中断底半部,开启当前CPU调度器的抢占。
- 示例
void foo()
{
{
进入临界区
}
}
独占写中断底半部上锁模式下的顺序锁RAII机制守卫
Seqlock::TryWrLkBhGrd : 独占写中断底半部尝试上锁模式
- 构造函数关闭当前CPU调度器的抢占,关闭本地CPU的中断底半部, 然后尝试上锁顺序锁。 上锁失败不会自旋等待,会开启当前CPU调度器的抢占,开启本地CPU的中断底半部, 并在
mRc
中返回 -EAGAIN
。
- 析构函数解锁顺序锁,开启本地CPU的中断底半部,开启当前CPU调度器的抢占。
- 示例
void foo()
{
{
if (
XWOK == grd.getRc()) {
} else {
}
}
}
Seqlock::WrLkIrqsGrd : 独占写部分中断上锁模式
- 构造函数关闭并保存模板参数列表内的中断,关闭当前CPU调度器的抢占,上锁顺序锁。 上锁失败会自旋等待,直到上锁成功为止。
- 析构函数解锁顺序锁,开启当前CPU调度器的抢占, 用保存的中断标志恢复模板参数列表内的中断。
- 示例
Seqlock::TryWrLkIrqsGrd : 独占写部分中断尝试上锁模式
- 构造函数关闭并保存模板参数列表内的中断,关闭当前CPU调度器的抢占,上锁顺序锁。 上锁失败不会自旋等待,会开启当前CPU调度器的抢占, 用保存的中断标志恢复模板参数列表内的中断, 并在
mRc
中返回 -EAGAIN
。
- 析构函数解锁顺序锁,开启当前CPU调度器的抢占, 用保存的中断标志恢复模板参数列表内的中断。
- 示例
void foo()
{
{
if (
XWOK == grd.getRc()) {
} else {
}
}
}
独占写部分中断尝试上锁模式下的顺序锁RAII机制守卫
C++ API
头文件: xwos/cxx/lock/Seqlock.hxx