简单如标题所述。基本上,在这个例子中,我们是否可能获得无效状态:
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处于无效状态会不会崩溃?或者这是"安全"?
答案 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正确编组,或使用操作系统提供的锁定功能。