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: Jonathan Taylor <email@hidden>
- Date: Thu, 14 Apr 2011 15:12:50 +0100
I am afraid I am not completely sure what you mean by your first problem, but hopefully my answer to your second one sidesteps your concern there. In answer to your second (once I had parsed out the two different uses of the word "block" in what you said!)...
> The second problem is that the pattern isn't actually thread safe. If two threads (that aren't the automatic thread of the queue) enter the accessor, two blocks will be enqueued serially. The two threads will then block, waiting for their blocks to finish executing.
>
> So far so good but when the first block finishes, it could happen that the first thread blocks until the second block finishes, at which time the foo value computed by the first block will have been replaced by the value computed by the second block, since foo is shared among all blocks that captured it.
If I understand you correctly, what you're saying about your variable "__block SomeObjType foo" is not true. Regardless of the __block qualifier, foo is effectively a stack-based variable, so two simultaneously-executing threads have their own independent instance of that variable. There can be no "cross-talk" between the variables in separate threads - all you are doing is enabling the block that a given thread executes to have access to that specific thread's stack variable.
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'm pretty sure that will behave as you want. This does of course assume that bah is created once and once only, and will never be released and set to nil while threads are using it. That is a big assumption, but I'm pretty sure that if you violate that condition then you are going to have to think VERY carefully about how to actually specify "sensible" behaviour at all based on this sort of accessor pattern, and do a lot of additional 'retain'ing of objects.
What do you reckon?
Jonny_______________________________________________
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