Re: How to count Atoms
Re: How to count Atoms
- Subject: Re: How to count Atoms
- From: "Gerriet M. Denkmann" <email@hidden>
- Date: Sat, 08 Oct 2016 11:06:22 +0700
> On 8 Oct 2016, at 05:01, Quincey Morris <email@hidden> wrote:
>
> On Oct 7, 2016, at 07:49 , Gerriet M. Denkmann <email@hidden> wrote:
>>
>> Is there a better way than this:
>> dsema = dispatch_semaphore_create( 0 );
>>
>> some loop to be counted
>> {
>> dispatch_semaphore_signal(dsema);
>> ….
>> }
>>
>> NSUInteger counter = 0;
>> for(;;)
>> {
>> long a = dispatch_semaphore_wait(dsema, DISPATCH_TIME_NOW);
>> if ( a != 0 ) break;
>> counter++;
>> };
>
> Er, I didn’t pay enough attention to this when you posted. No, this isn’t the correct approach. You’re supposed to be using the semaphore as a lock. In theory, you’d do it like this:
>
>> dsema = dispatch_semaphore_create (1);
>>
>> NSUInteger counter = 0;
>>
>> for …
>> {
>> …
>> dispatch_semaphore_wait (dsema, <forever>);
>> counter++;
>> dispatch_semaphore_signal (dsema);
>> }
>
> That is, the semaphore controls access to a pool of 1 resources (the resource being permission to increment the counter), and you wait on the resource to become available (“lock”), increment the counter, then release the resource (“unlock”).
This looks much better.
But, alas, it is also much slower: overhead almost 40 sec (whereas my admittedly rather hackish way took less then half a second).
B.t.w.: I also tried NSLock - it is even slower (but not much) than @synchronized.
My preferred way to count (not deprecated and fast, but, as you said, probably not available in Swift) is:
#import <stdatomic.h>
atomic_uint_fast64_t counter;
atomic_fetch_add_explicit( &counter, 1, memory_order_relaxed );
I have no idea, whether atomic_uint_fast64_t is correct (there also is atomic_uint_least64_t — what is the difference ?)
and what memory_order_relaxed means (Xcode suggested this to me while warning about deprecation of OSAtomicIncrement64).
I looked at <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf> (as kindly mentioned by Alastair).
In “7.17.6 Atomic integer types” it says: “The semantics of the operations on these types are defined in 7.17.7”.
But 7.17.7 does not mention any difference between atomic_uint_fast64_t and atomic_uint_least64_t.
Kind regards,
Gerriet.
_______________________________________________
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