Re: index beyond bounds when using a queue for a for-loop
Re: index beyond bounds when using a queue for a for-loop
- Subject: Re: index beyond bounds when using a queue for a for-loop
- From: Koen van der Drift <email@hidden>
- Date: Mon, 12 Aug 2013 15:19:10 -0400
Thanks for all the input. I solved it by using a straightforward C-array, which I think also circumvents the scenario that Conrad describes about the crash being caused by index 3 being set before index 2.
As it turns out, the time for the whole loop *decreased* by 5-10 fold by using a dispatch_queue_t. So next I will look in the code that updates the GUI to see where the bottleneck lies.
- Koen.
On Aug 12, 2013, at 3:07 PM, Conrad Shultz <email@hidden> wrote:
>
> On Aug 12, 2013, at 11:23 AM, Koen van der Drift <email@hidden> wrote:
>
>>
>> On Aug 12, 2013, at 2:05 PM, Jens Alfke <email@hidden> wrote:
>>
>>> NSMutableArray isn’t thread-safe. You’ll need to synchronize/serialize the assignments somehow. You could do something like
>>>
>>> {
>>> id value = [self doCalculation: i];
>>> @synchronized(myArray) {
>>> myArray[i] = value;
>>> }
>>> }
>>>
>>
>> Unfortunately, I'm still getting the same error.
>
> I suspect there’s an additional complication. In your single-threaded case you probably assumed that `i` increased uniformly and monotonically, so that myArray[i] = foo always appended objects to the array. In a multithreaded implementation this is no longer the case: there’s a race between different values of `i`, so it’s entirely possible that you will try to, say, set the object at index 3 before index 2. This will raise a range exception as you are seeing.
>
> There are at least two possible fixes.
>
> First, since you know the array size in advance, you could do something like pre-fill myArray with [NSNull null]. This would work around the range exception by having your code replace objects rather than append new objects.
>
> Second, you could switch from an array to an order-agnostic collection such as a dictionary or set. NSPointerArray may also provide useful behavior.
>
> Exactly which approach you take will depend on specifics about your application and the problem you are solving.
>
> -Conrad
_______________________________________________
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