• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Lockless thread-safe accessor using blocks: how to?
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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

  • Follow-Ups:
    • Re: Lockless thread-safe accessor using blocks: how to?
      • From: WT <email@hidden>
  • Prev by Date: Re: Make text field set value even if apparently unchanged
  • Next by Date: Re: isDeletableFileAtPath: returns YES for locked files???
  • Previous by thread: Re: Lockless thread-safe accessor using blocks: how to?
  • Next by thread: Re: Lockless thread-safe accessor using blocks: how to?
  • Index(es):
    • Date
    • Thread