这是一个代码片段(来自关于 GCD 的Aubrey Kate课程),它将使Xcode
Thread sanitizer
(AKA TSan
) - 检测到Data race
:
import UIKit
final class MainViewController: UIViewController {
var counter = 0
override func viewDidLoad() {
super.viewDidLoad()
let queue = DispatchQueue(label: "q")
queue.async {
for _ in 1 ... 10000 {
Thread.sleep(forTimeInterval: 0.1)
self.counter += 1
}
}
DispatchQueue.main.async {
for _ in 1 ... 10000 {
self.counter += 1
}
}
}
}
但是如果我注释掉Thread.sleep(forTimeInterval: 0.1)
-我TSan
对我没有意见并且不会使程序崩溃。
TSan
我的问题是无法检测到数据竞赛的本质变化???为什么 TSan 需要该Thread.sleep
功能才能找到data race
它,而没有它,它就无法定位。