Swift 原子 bool 值

标签 swift thread-safety

我正在尝试围绕 iOS OSTestAndSet()OSTestAndClear() 函数创建一个包装器,以便与基于以下 GitHub code 的原子 bool 类型一起使用:

class AtomicBoolean {

    private var val: Byte = 0

    /// Sets the value, and returns the previous value.
    /// The test/set is an atomic operation.
    func testAndSet(value: Bool) -> Bool {
        if value {
            return OSAtomicTestAndSet(0, &val)
        } else {
             return OSAtomicTestAndClear(0, &val)
        }
    }

    /// Returns the current value of the boolean.
    /// The value may change before this method returns.
    func test() -> Bool {
        return val != 0
    }

}

但是,我收到一个关于属性声明的编译器错误:Use of undeclared type 'Byte';您是要使用“UInt8”吗?

目前,我正在为此代码文件导入 Foundation。我已经看到其他 stackoverflow 帖子使用 Byte 类型,但我无法找到为什么这在我的案例中不可用。

我正在使用以下版本的 Swift: Apple Swift 版本 1.2 (swiftlang-602.0.53.1 clang-602.0.53)

此外,如果我按照编译器的建议将数据类型更改为 UInt8,我会在 OSAtomicTestAndSet() 和 OSAtomicTestAndClear() 调用中收到其他错误,这些错误说明如下:无法分配给类型为“UInt8”的不可变值 尽管我使用的是 var 声明而不是 let

最佳答案

请注意,此类的实现是伪造的。它设置最高有效位#0,而不是最低有效位#7。这是正确的实现:

public class AtomicBoolean {  
  private var val: UInt8 = 0

  public init(initialValue: Bool) {
    self.val = (initialValue == false ? 0 : 1)
  }

  public func getAndSet(value: Bool) -> Bool {
    if value {
      return  OSAtomicTestAndSet(7, &val)
    } else {
      return  OSAtomicTestAndClear(7, &val)
    }
  }

  public func get() -> Bool {
    return val != 0
  }
}

还有一个测试来验证:

public class AtomicTest: XCTestCase {

  func testSimple() {
    let x = AtomicBoolean(initialValue: true)
    XCTAssertTrue(x.get())
    XCTAssertTrue(x.get())
    XCTAssertTrue(x.getAndSet(true))
    XCTAssertTrue(x.getAndSet(false))
    XCTAssertFalse(x.get())
    XCTAssertFalse(x.getAndSet(true))
    XCTAssertTrue(x.get())
  }
}

关于Swift 原子 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31954537/

相关文章:

ios - 使用自定义 UIView 在 Swift 中创建弹出窗口

ios - 如何检查 Alamofire 因网络连接不良而失败?

c# - 并发互锁和读取是否需要内存屏障或锁定?

java - 在 Java 中测试线程安全

c# - 结构数组,多线程,我可以同时写到不同的索引吗?

swift - 为什么我的 UITableView 滚动偏移在返回其 View 时最终位于 UISearchController 后面?

objective-c - 如何用 arg 写 block 。 Swift 闭包中的 "UnsafeMutablePointer<UnsafeMutablePointer<Float>>"

swift - 一种返回两个日期之间的日期数组的方法 - Swift 3

c# - 为什么调用 null 事件处理程序不会引发异常?

thread-safety - Boost :condition_variable. notify_one()导致segmentation fault 11异常