在Swift中设置和读取Bool原子操作?

时间:2017-01-13 17:02:41

标签: multithreading swift3 boolean

简单如标题所述。基本上,在这个例子中,我们是否可能获得无效状态:

var myBool = false

// Thread 1
while true {
    if randomEvent() {
        myBool = true
    }
}

// Thread 2
while true {
    if myBool {
        print("Was set to true")
    } else {
        print("Not set")
    }
}

因为myBool处于无效状态会不会崩溃?或者这是"安全"?

2 个答案:

答案 0 :(得分:3)

我不确定你认为这与“线程安全”或“原子”甚至是Swift有什么关系。多线程的本质如下。每当你说出这种形式的东西时:

if myBool {
    print("Was set to true")

...您应该假设如果可以在另一个线程上设置myBool,则可以在第一行和第二行之间设置。这可能会导致"Was set to true"被打印,即使此时它是false,或者相反可能会导致它被打印,即使此时它是{{1} }}

答案 1 :(得分:3)

在对Swift Users邮件列表进行讨论后,确认Bool值的读写不是Swift中的原子操作。此外,上面的代码可以由编译器优化,并且因为永远不会在线程2的上下文中设置myBool,所以它可以优化检查。在Swift中执行此操作的唯一有效方法是使用GCD正确编组,或使用操作系统提供的锁定功能。