MSTL 1.4.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::wait_bitset = 9 ,
  futex_wait_flags::wake_bitset = 10 , 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 MSTL_API futex_wait (void *addr, platform_wait_t value) noexcept
 无限期等待FUTEX
bool MSTL_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 MSTL_API futex_notify (void *addr, bool all) noexcept
 通知等待的线程

变量

template<typename T>
MSTL_INLINE17 constexpr bool platform_wait_valid_v
 检查类型是否适用于平台等待操作

详细描述

FUTEX同步原语的跨平台封装

类型定义说明

◆ platform_wait_t

初始值:
int

平台等待类型别名

用于FUTEX操作的等待类型

在文件 futex.hpp26 行定义.

枚举类型说明

◆ futex_wait_flags

enum class futex_wait_flags : platform_wait_t
strong

FUTEX操作标志枚举

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

枚举值
private_flag 

私有标志位

wait 

等待操作

wake 

唤醒操作

wait_bitset 

位集等待操作

wake_bitset 

位集唤醒操作

wait_private 

私有等待操作

wake_private 

私有唤醒操作

wait_bitset_private 

私有位集等待操作

wake_bitset_private 

私有位集唤醒操作

bitset_match_any 

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

在文件 futex.hpp53 行定义.

函数说明

◆ futex_notify()

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

通知等待的线程

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

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

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

引用了 MSTL_END_NAMESPACE__.

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

◆ futex_wait()

void MSTL_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.hpp134 行定义.

引用了 _INNER , 以及 timeout.

◆ futex_wait_until() [2/2]

bool MSTL_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 在等待期间保持有效且可访问

变量说明

◆ platform_wait_valid_v

template<typename T>
MSTL_INLINE17 constexpr bool platform_wait_valid_v
constexpr
初始值:
= is_scalar_v<T>
&& sizeof(T) == sizeof(platform_wait_t)
&& alignof(T*) >= alignof(platform_wait_t)
int platform_wait_t
平台等待类型别名

检查类型是否适用于平台等待操作

模板参数
T要检查的类型

类型必须满足以下条件:

  1. 标量类型
  2. 大小等于平台等待类型的大小
  3. 对齐要求不低于平台等待类型的对齐要求

在文件 futex.hpp43 行定义.