1#ifndef NEFORCE_CORE_ASYNC_FUTEX_HPP__
2#define NEFORCE_CORE_ASYNC_FUTEX_HPP__
13NEFORCE_BEGIN_NAMESPACE__
33#ifdef NEFORCE_PLATFORM_WINDOWS
47#ifdef NEFORCE_PLATFORM_LINUX
107 bool is_monotonic =
false);
121#ifdef NEFORCE_PLATFORM_LINUX
122# define NEFORCE_FUTEX_HAS_ADVANCED 1
124int futex(
void* wait_addr,
futex_wait_flags flags,
int wake_count,
void* requeue_addr,
int requeue_count,
125 int cmp_value)
noexcept;
135int NEFORCE_API
futex_requeue(
void* wait_addr,
int wake_count,
void* requeue_addr,
int requeue_count)
noexcept;
148int NEFORCE_API
futex_wake_op(
void* addr,
int wake_count,
void* op_addr,
int op_arg,
int op,
int cmp,
149 int cmp_arg)
noexcept;
151int NEFORCE_API futex_lock_pi(
void* addr)
noexcept;
152int NEFORCE_API futex_trylock_pi(
void* addr)
noexcept;
153int NEFORCE_API futex_unlock_pi(
void* addr)
noexcept;
170NEFORCE_END_NAMESPACE__
long long int64_t
64位有符号整数类型
int futex_requeue(void *wait_addr, int wake_count, void *requeue_addr, int requeue_count) noexcept
将部分等待线程转移到另一个 futex
void futex_wait(void *addr, platform_wait_t value) noexcept
无限期等待FUTEX
int futex_wake_op(void *addr, int wake_count, void *op_addr, int op_arg, int op, int cmp, int cmp_arg) noexcept
唤醒线程的同时原子修改另一个 futex 的值
long platform_wait_t
平台等待类型别名
int futex_wait_requeue_pi(void *wait_addr, int value, void *requeue_addr) noexcept
等待并转移到 PI futex(用于条件变量与 PI 锁配合)
void futex_notify(void *addr, bool all) noexcept
通知等待的线程
futex_wait_flags
FUTEX操作标志枚举
bool futex_wait_until(void *addr, platform_wait_t value, bool has_timeout, int64_t sec, int64_t ns, bool is_monotonic=false)
等待FUTEX直到指定时间点或条件满足
@ bitset_match_any
匹配任何等待集合的位掩码
@ wake_bitset_private
私有位集唤醒操作
@ wait_bitset_private
私有位集等待操作
@ wait_requeue_pi
等待并转移到PI FUTEX
@ requeue
将等待队列转移到另一个FUTEX
@ cmp_requeue_pi
带比较的等待并转移