[swift-dev] Race conditions with lazy variables
Dan Zimmerman
daniel.zimmerman at me.com
Thu Jan 26 01:26:06 CST 2017
Hey,
Today I ran into an issue where I had a lazy instance variable that was being initialized multiple times due to a race condition. For example:
```
import Darwin
import Dispatch
func doSomethingIntense() {
usleep(100000)
}
var counter: Int = 0
class Cat {
lazy var sound: String = {
doSomethingIntense()
let isFive = counter == 5
counter += 1
print("Getting \(Unmanaged.passUnretained(self).toOpaque()).sound")
return isFive ? "doctorate denied" : "meow"
}()
}
let cat = Cat()
for _ in 1..<10 {
if #available(OSX 10.10, *) {
usleep(100);
DispatchQueue.global(qos: .background).async {
print("The cat says \(cat.sound)")
}
}
}
dispatchMain()
```
I was wondering what the "swifty" way to fix this issue would be (assuming I only want the lazy initializer to be called once) - since dispatch_once was taken out I don't see a clean way to do this without interacting with pthread_mutex's directly.
I was also wondering if there's been any discussion surrounding this - i.e. I can't imagine an instance where I have a lazy variable initialized via a closure that I'm ok with it being initialized twice.
More information about the swift-dev
mailing list