主要观点:多数主流操作系统目前提供某种形式的类似futex的功能,本文介绍了不同操作系统的相关情况及使用注意事项等。
关键信息:
- Windows:有
keyed events和WaitOnAddressAPI家族两种选择,keyed events在ntdll中,不稳定且无官方文档;WaitOnAddress是Windows 8 API,有兼容性缺点。 - Darwin(macOS等):有不稳定的
__ulock_wait/__ulock_wakeAPI,在私有头文件中,使用时需注意。 - 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-syscrate。 - Android中,可在C或C++中定义缺失的
futex相关常量,Rust中可在Android上无条件定义常量。 - 各种BSD中不同系统的具体
futex相关函数及支持情况。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。