On Nov 12, 2012, at 8:41 AM, Joerg Simon wrote: > On Nov 12, 2012, at 3:33 PM, Tom Davie <[email protected]> wrote: > >> On 12 Nov 2012, at 14:18, Joerg Simon <[email protected]> wrote: >> >>> You can use dispatch_sync. The blog post of oliver dobnigg (cocoanetics) >>> summs that up quite nicely: >>> http://www.cocoanetics.com/2012/02/threadsafe-lazy-property-initialization/ >> >> Or you can use dispatch_once, but make sure the once token is an ivar, >> unlike I did. > > As you can read in the blog too, the developer documentation of dispatch_once > states: > > "The predicate must point to a variable stored in global or static scope. The > result of using a predicate with automatic or dynamic storage is undefined." > > so, no, you can not. Actually it works most of the time, but you can not rely > on it...
Far be it from me to discourage people from paying attention to the docs, but I'm pretty sure that the docs are excessively restrictive in this case. >From working with similar constructs in other APIs, I believe the actual >requirements are: 1) All of the threads which are to coordinate on doing a task exactly once must be referring to the same storage for the once predicate. 2) The predicate storage has to be guaranteed to have been allocated and initialized to zero before any threads access it. 3) The storage must not be deallocated until after it is guaranteed that no threads will reference it again. Obviously, automatic storage violates rule 1. Most schemes which try to dynamically allocate the storage just before it's needed would normally run into the same race condition that dispatch_once() is trying to solve. And the most common anticipated use case is for ensuring that a given task is only performed once, globally. So, avoiding dynamic storage is a nice simple rule. (It's also easy to forget to set dynamically allocated storage to zero before using it.) But an instance variable still satisfies all three requirements for the case where a task needs to be performed only once per instance. And the blog's speculation that there's some special characteristic of statically allocated memory vs. dynamically allocated memory that is important to dispatch_once()'s synchronization strikes me as very, very improbable. Regards, Ken _______________________________________________ Cocoa-dev mailing list ([email protected]) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to [email protected]
