Can someone please give me a sample of the valid way of using
NSCondition for this? I am still confused regarding how I can avoid
the subtle sync errors.

I've tried the following code

// main thread
// cancel operation
[m_operation cancel];
// wait until operation exits
[m_operationCompletionCondition lock];
[m_operationCompletionCondition wait];
[m_operationCompletionCondition unlock];

The operation object:

- (id) initWithCompletionCondition:(NSCondition*)completionCondition
{
    ...
  m_completionCondition = [completionCondition retain];
  // lock the condition while in the main thread
  [m_completionCondition lock];

}

// Worker thread's main
- (void)main
{
        ...
        // signal operation completed from the worker thread
        [m_completionCondition signal];
        [m_completionCondition unlock];
}

The problem is however that sometimes the worker thread exits in
between the -cancel message and before the -wait message. So there is
nothing to wait anymore and the program waits endlessly. I don't see
how to resolve this problem without going too sophisticated. I must be
doing something wrong, don't I?


On Thu, Feb 12, 2009 at 1:39 PM, Andrew Farmer <andf...@gmail.com> wrote:
> On 12 Feb 09, at 01:25, Oleg Krupnov wrote:
>>
>> This seems a trivial question for a multi-threading app, but I haven't
>> been successful in implementing this in Cocoa. I've got deadlocks and
>> strange logs for seemingly no reason.
>
> <snip>
>>
>> // the operation object eventually checks the -isCancelled flag and
>> then sends -unlock to the lock, and its thread exits.
>
> This is not an appropriate use of locks, and the runtime error you're
> getting ("lock unlocked from thread which did not lock it") is a sign of
> this misuse. Indeed, the design you've described actually contains a subtle
> synchronization error that could cause deadlock if your code attempts to
> cancel a thread before it has fully initialized.
>
> As a general point, though, locks are designed for mutual exclusion on
> shared resources, not inter-thread signalling. Use NSCondition for this sort
> of communication; alternatively, you may want to investigate pthread_cancel
> for a more specific solution.
>
_______________________________________________

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to