Learn more about Russian war crimes in Ukraine.

What is stdatomic in C?

I was watching a talk yesterday about Go’s sync/atomic package which provides atomic operations like AddInt32(*int32, int32). These are implemented using special atomic CPU instructions.

I wondered what the equivalent is in C. The equivalent is stdatomic, which provides operations like atomic_fetch_add(atomic_int*, int). Here’s an example:

#include <stdio.h>
#include <stdatomic.h>
#include <pthread.h>

int cnt;
atomic_int acnt;

void* f(void* param) {
  for(int n = 0; n < 1000; ++n) {
    ++cnt;
    atomic_fetch_add(&acnt, 1);
  }
  return NULL;
}

int main(void) {
  pthread_t t[10];
  for (int i = 0; i < 10; i++) pthread_create(&t[i], NULL, f, NULL);
  for (int i = 0; i < 10; i++) pthread_join(t[i], NULL);
  printf("acnt = %u; cnt = %u;\n", acnt, cnt);
}
$ clang atomic_test.c
$ ./a.out
acnt = 10000; cnt = 7442;

Actually, I lied about the type signature of atomic_fetch_add. Its full signature is:

C atomic_fetch_add(volatile A* obj, M arg);
C atomic_fetch_add_explicit(volatile A* obj, M arg, memory_order order);

There are multiple things in here I don’t understand properly:

What can computers do? What are the limits of mathematics? And just how busy can a busy beaver be? This year, I’m writing Busy Beavers, a unique interactive book on computability theory. You and I will take a practical and modern approach to answering these questions — or at least learning why some questions are unanswerable!

It’s only $19, and you can get 50% off if you find the discount code ... Not quite. Hackers use the console!

After months of secret toil, I and Andrew Carr released Everyday Data Science, a unique interactive online course! You’ll make the perfect glass of lemonade using Thompson sampling. You’ll lose weight with differential equations. And you might just qualify for the Olympics with a bit of statistics!

It’s $29, but you can get 50% off if you find the discount code ... Not quite. Hackers use the console!

More by Jim

Tagged . All content copyright James Fisher 2017. This post is not associated with my employer. Found an error? Edit this page.