Milan Stephan
Fotografie & IT

Zurück zur SP2 Übersicht

atomic.c

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

#ifdef __STDC_NO_ATOMICS__
	#error No support for C11 Atomics
#endif

// Nur volatile bringt nichts, da es lediglich dafür sorgt,
// dass die Werte wieder in den Speicher zurückgeschrieben
// werden und nicht im Register gehalten werden dürfen.
// Bei der Verwendung der atomic-Datentypen braucht man kein volatile mehr.
static _Atomic long foo = ATOMIC_VAR_INIT(0);
static long bar = 0;

// Counter Thread
static void *counter(void *arg) {
	for (long i = 0; i < 10000000; ++i) {
		bar++;
	}
	for (long i = 0; i < 10000000; ++i) {
		// Atomic version of foo++
		atomic_fetch_add(&foo, 1);
	}
	return NULL;
}

int main(void) {

	int threads = 10;
	pthread_t tids[threads];

	// Start Threads
	for (int i = 0; i < threads; ++i) {
		pthread_create(&tids[i], NULL, counter, NULL);
	}

	// Join Threads
	for (int i = 0; i < threads; ++i) {
		void *bla;
		pthread_join(tids[i], &bla);
	}

	printf("foo = %zu\n", foo);
	printf("bar = %zu\n", bar);

	return EXIT_SUCCESS;
}