swift-atomics 构建状态

一些通过 Clang 提供给 Swift 的原子函数。

注意:此软件包已被官方原子预览包 Swift Atomics 取代。

/usr/include/libkern/OSAtomic.h 中提供的原子函数在 Swift 中受到很大的限制,这是由于 Swift 和 C 的类型系统之间存在阻抗不匹配。此外,诸如同步加载或同步存储之类的简单操作也无法直接使用。最重要的是,它们现在已被弃用。

当然,Clang 实现了 C11 原子函数,并且它们在 Linux 上可用。

本项目将 Clang 的 C11 原子操作支持的子集桥接到 Swift,作为两个模块。

最新版本 (6.5.0) 支持 Swift 4.0 及更高版本。

此软件包的 6.2.3 版本支持低至 3.1.1 的 Swift 版本。

模块 SwiftAtomics

SwiftAtomics 具有 swift 风格的接口,用于提供对原子操作的访问。 SwiftAtomics 实现了以下类型:

指针类型具有以下方法:

整数类型具有以下方法:

AtomicBool 具有以下方法:

可以通过在每个方法上使用 order 参数来设置内存顺序(来自 <stdatomic.h>);默认值是:加载操作为 .acquire,存储操作为 .release,读-修改-写操作为 .acqrel。请注意,memory_order_consume 在此模块中没有等效项,因为(据我所知)clang 会默默地将该顺序升级为 memory_order_acquire,因此(目前)无法测试算法是否可以正确使用 memory_order_consume。这也意味着它的缺失没有任何损失。

整数类型具有 value 属性,作为执行 .relaxed 加载的便捷方法。 指针类型具有 pointer 属性,该属性执行 .acquire 加载。

关于原子性和互斥律的说明

原子类型作为线程之间的同步点非常有用,因此与 Swift 的排他性检查有着有趣的关系。它们应该用作引用类型的成员,或者直接被闭包捕获。它们是 struct 类型,因此不会产生额外的内存分配,但此功能意味着如果使用线程清理器,它会发出警告。

SwiftAtomics 中定义的类型用作类实例的成员时,它们与 Swift 5 的运行时排他性检查一起按预期工作,但是在启用线程清理器时会出现困难。

为了以线程清理器可以接受的方式使用原子变量,必须使用 UnsafeMutablePointer 在堆上为原子变量分配内存。如果您需要与线程清理器兼容,最好直接使用底层依赖项 CAtomics,或者更好的是,使用官方 Swift Atomics 原子预览包。

要求

此版本的 SwiftAtomics 需要 Swift 4.0 或更高版本。在 Linux 上,它还需要 Clang 3.6 或更高版本。