NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到

FUTEX同步原语的跨平台封装 更多...

FUTEX 的协作图:

class  atomic_futex< WaiterBit >
 原子快速用户态互斥锁类模板 更多...

类型定义

using platform_wait_t
 平台等待类型别名

枚举

enum class  futex_wait_flags : platform_wait_t {
  futex_wait_flags::private_flag = 0 , futex_wait_flags::wait = 0 , futex_wait_flags::wake = 1 , futex_wait_flags::requeue = 3 ,
  futex_wait_flags::cmp_requeue = 4 , futex_wait_flags::wake_op = 5 , futex_wait_flags::lock_pi = 6 , futex_wait_flags::unlock_pi = 7 ,
  futex_wait_flags::trylock_pi = 8 , futex_wait_flags::wait_bitset = 9 , futex_wait_flags::wake_bitset = 10 , futex_wait_flags::wait_requeue_pi = 11 ,
  futex_wait_flags::cmp_requeue_pi = 12 , futex_wait_flags::wait_private = wait | private_flag , futex_wait_flags::wake_private = wake | private_flag , futex_wait_flags::wait_bitset_private = wait_bitset | private_flag ,
  futex_wait_flags::wake_bitset_private = wake_bitset | private_flag , futex_wait_flags::bitset_match_any = -1
}
 FUTEX操作标志枚举 更多...

函数

template<typename Clock, typename Dur>
bool futex_wait_until (const platform_wait_t *addr, platform_wait_t old, const time_point< Clock, Dur > &timeout)
 FUTEX定时等待函数
void NEFORCE_API futex_wait (void *addr, platform_wait_t value) noexcept
 无限期等待FUTEX
bool NEFORCE_API futex_wait_until (void *addr, platform_wait_t value, bool has_timeout, int64_t sec, int64_t ns, bool is_monotonic=false)
 等待FUTEX直到指定时间点或条件满足
void NEFORCE_API futex_notify (void *addr, bool all) noexcept
 通知等待的线程

详细描述

FUTEX同步原语的跨平台封装

类型定义说明

◆ platform_wait_t

初始值:
int

平台等待类型别名

用于FUTEX操作的等待类型

在文件 futex.hpp32 行定义.

枚举类型说明

◆ futex_wait_flags

enum class futex_wait_flags : platform_wait_t
strong

FUTEX操作标志枚举

定义FUTEX系统调用的操作标志。这些标志对应于Linux内核的FUTEX操作。

枚举值
private_flag 

私有标志位

wait 

等待操作

wake 

唤醒操作

requeue 

将等待队列转移到另一个FUTEX

cmp_requeue 

带比较的转移

wake_op 

唤醒并原子修改另一个FUTEX

lock_pi 

优先级继承锁(加锁)

unlock_pi 

优先级继承锁(解锁)

trylock_pi 

尝试加锁(非阻塞)

wait_bitset 

位集等待操作

wake_bitset 

位集唤醒操作

wait_requeue_pi 

等待并转移到PI FUTEX

cmp_requeue_pi 

带比较的等待并转移

wait_private 

私有等待操作

wake_private 

私有唤醒操作

wait_bitset_private 

私有位集等待操作

wake_bitset_private 

私有位集唤醒操作

bitset_match_any 

匹配任何等待集合的位掩码

在文件 futex.hpp46 行定义.

函数说明

◆ futex_notify()

void NEFORCE_API futex_notify ( void * addr,
bool all )
noexcept

通知等待的线程

参数
addrFUTEX变量的地址
all是否通知所有等待线程

唤醒正在等待addr处值变化的线程。 如果all为true,唤醒所有等待线程;否则只唤醒一个等待线程。

警告
调用者必须确保 addr 在等待期间保持有效且可访问

被这些函数引用 atomic_futex< WaiterBit >::store_notify_all().

◆ futex_wait()

void NEFORCE_API futex_wait ( void * addr,
platform_wait_t value )
noexcept

无限期等待FUTEX

参数
addrFUTEX变量的地址
value期望的值,只有当地址处的值等于此值时才等待

阻塞当前线程,直到addr处的值不等于value或收到通知。 这是最基本的FUTEX等待操作,没有超时限制。

警告
调用者必须确保 addr 在等待期间保持有效且可访问

◆ futex_wait_until() [1/2]

template<typename Clock, typename Dur>
bool futex_wait_until ( const platform_wait_t * addr,
platform_wait_t old,
const time_point< Clock, Dur > & timeout )

FUTEX定时等待函数

模板参数
Clock时钟类型
Dur持续时间类型
参数
addr等待地址
old期望的值
timeout超时时间点
返回
等待是否成功

公共的FUTEX定时等待接口,支持任意时钟类型。

在文件 atomic_timed_wait.hpp140 行定义.

引用了 timeout.

◆ futex_wait_until() [2/2]

bool NEFORCE_API futex_wait_until ( void * addr,
platform_wait_t value,
bool has_timeout,
int64_t sec,
int64_t ns,
bool is_monotonic = false )

等待FUTEX直到指定时间点或条件满足

参数
addrFUTEX地址
value期望的值
has_timeout是否启用超时。如果为false,则忽略时间参数
sec超时时间的秒数部分
ns超时时间的纳秒数部分
is_monotonic是否使用单调时钟
返回
bool 等待结果:
  • true: 等待成功结束(被唤醒或值已改变)
  • false: 等待超时(仅当has_timeout为true时可能)

阻塞当前线程,直到以下条件之一满足:

  1. addr 处的值不等于期望的 value
  2. 达到指定的超时时间
  3. 被其他线程唤醒
注解
函数可能因系统信号等原因返回,即使条件未满足,产生虚假唤醒。调用者需要循环检查条件
实际超时精度受系统调度器和时钟精度限制
警告
调用者必须确保 addr 在等待期间保持有效且可访问