On Nov 12, 2012, at 8:41 AM, Joerg Simon wrote:

> On Nov 12, 2012, at 3:33 PM, Tom Davie <tom.da...@gmail.com> wrote:
> 
>> On 12 Nov 2012, at 14:18, Joerg Simon <j_si...@mac.com> 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 (Cocoa-dev@lists.apple.com)

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 arch...@mail-archive.com

Reply via email to