Re: Lockless thread-safe accessor using blocks: how to?
Re: Lockless thread-safe accessor using blocks: how to?
- Subject: Re: Lockless thread-safe accessor using blocks: how to?
- From: WT <email@hidden>
- Date: Thu, 14 Apr 2011 13:47:47 -0300
On Apr 14, 2011, at 1:19 PM, Jonathan Taylor wrote:
> I tested this out before replying as I wasn't 100% certain. It may be that we have misunderstood each other somehow, but the following code (in a clean new project) was what I used to confirm to myself that two concurrently-executing threads have independent instances of the variable:
> http://www.dur.ac.uk/j.m.taylor/block_test_code.m
More likely, I've misunderstood the documentation. It's happened before, many times. :)
I looked at your code only briefly now but will return to study it in detail later (kinda busy right now). I must say that I'm confused now more than before, because I really thought that the __block qualifier meant that there is only one instance of that variable, shared by all scopes that declare it and shared by all blocks that capture it.
>>> However I don't think you should need to do this anyway. I would change your code to something like this:
>>>
>>> - (SomeObjType) foo
>>> {
>>> dispatch_sync(queue,
>>> ^{
>>> // Code in this block ensures bah is valid
>>> if (nil == bah)
>>> {
>>> // Code to compute and store bah goes here
>>> }
>>> });
>>>
>>> return bah;
>>> }
>>
>> I don't see how that could possibly work as is because bah is out of scope by the time the return statement is executed. Perhaps you meant that bah is an ivar or property declared in the same class as the accessor. I'm suddenly drawing a blank here because I considered this before and came to the conclusion that it wouldn't work but now I can't remember why I thought that way. I need to think this through a bit more.
> OK, well since you do not declare bah locally, and from what you are doing it is presumably meant to be persistent, I assumed that it was indeed a property (or a global?). If you are doing something else with it (though I'm not quite sure what...) then obviously what I wrote may be wrong...
No, actually you are totally correct here. As it happens, I do use the pattern you suggest, in several places where the conditions are precisely those you laid out: the ivars are meant to be instantiated only once and never released. It's in other cases where those conditions break that I'm struggling with.
Clearly I need to refine my understanding of blocks and discussions like this greatly help.
Thanks again.
WT_______________________________________________
Cocoa-dev mailing list (email@hidden)
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:
This email sent to email@hidden