主要观点:多数主流操作系统目前提供某种形式的类似futex
的功能,本文介绍了不同操作系统的相关情况及使用注意事项等。
关键信息:
- Windows:有
keyed events
和WaitOnAddress
API家族两种选择,keyed events
在ntdll
中,不稳定且无官方文档;WaitOnAddress
是Windows 8 API,有兼容性缺点。 - Darwin(macOS等):有不稳定的
__ulock_wait
/__ulock_wake
API,在私有头文件中,使用时需注意。 - Android:可像在Linux上一样使用
futex
,需注意futex.h
头文件的问题。 - 各种BSD:OpenBSD称其为
futex
,支持常用部分;FreeBSD有_umtx_op
;Dragonfly有umtx_sleep
和umtx_wakeup
。 - 其他:C++20标准库新增
wait
和notify
操作;Web平台的JSAtomics
对象支持wait
和notify
;WebAssembly的线程提案也包含相关指令;Fuchsia OS有支持。
重要细节: - Windows中,可先尝试从
API-MS-Win-Core-Synch-l1-2-0.dll
加载WaitOnAddress
函数,失败后 fallback 到ntdll/keyed events
。 - Darwin中,C或C++可使用
weak_import
属性或dlsym
进行懒加载处理较老的操作系统或缺失的API;Rust可使用ulock-sys
crate。 - Android中,可在C或C++中定义缺失的
futex
相关常量,Rust中可在Android上无条件定义常量。 - 各种BSD中不同系统的具体
futex
相关函数及支持情况。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。