Atomic increment on mac OS X

2019-03-16 09:59发布

问题:

I have googled for atomic increment and decrement operators on Mac OS X and found "OSAtomic.h", but it seems you can only use this in kernel space.

Jeremy Friesner pointed me at a cross-platform atomic counter in which they use assembly or mutex on OS X (as far as I understood the interleaving of ifdefs).

Isn't there something like InterlockedDecrement or atomic_dec() on OS X ?

回答1:

What makes you think OSAtomic is kernel space only? The following compiles and works fine.

#include <libkern/OSAtomic.h>
#include <stdio.h>

int main(int argc, char** argv) {
  int32_t foo = 1;
  OSAtomicDecrement32(&foo);
  printf("%d\n", foo);

  return 0;
}


回答2:

Currently, the recommendation is to use C++11's std::atomic.



回答3:

You could also check out Intel's Threaded Building Blocks for their atomic template class.



回答4:

You can also use IncrementAtomic() and DecrementAtomic() via CoreServices:

#include <CoreServices/CoreServices.h>

int main(int argc, char** argv) 
{
  int val = 0;
  IncrementAtomic(&val);
  DecrementAtomic(&val);    

  return 0;
}

Note: the return value of these functions is the value of the integer before it is incremented, so if you want similar behavior to the Win32 InterlockedIncrement() and InterlockedDecrement() functions, you will need to create wrappers that +1 to the return value.



标签: c++ atomic