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.
_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to