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 14:11:45 -0300
Hi Dave,
thanks for replying. I must say some of what you said went above my head. :)
On Apr 14, 2011, at 2:02 PM, Dave Zarzycki wrote:
>> The first is that if the method gets invoked already in the queue's automatic thread, there will be a deadlock. That's easy to fix, by wrapping the dispatch call into a function that tests queue against the currently executing queue and simply executes the block when they coincide.
>
> Actually, this isn't easy to fix due to X->A->B->A problems, where X is the current queue, then A, then B, and then the code deadlocks trying to dispatch_sync() against A "because it isn't the current queue".
Why isn't the following deadlock-free?
// In WLT_GCDUtils.m
+ (void) dispatchToQueue: (dispatch_queue_t) queue
async: (BOOL) async
block: (void (^)(void)) block;
{
if (dispatch_get_current_queue() != queue)
{
if (async)
{
dispatch_async(queue, block);
}
else
{
dispatch_sync(queue, block);
}
}
else // already in target queue
{
// Just in case we might need one...
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
block();
[pool release];
}
}
>> 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.
>>
>> Thus, when the first thread resumes, it will report the wrong foo value.
>
> Can you please provide a compilable test case?
I don't have an actual sample case where it has happened. Admittedly, this was just a thought experiment.
Thanks again for your help.
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