/** pthread_spinloc_t test. */ /* Make sure pthread_spinlock_t is available when compiling with older glibc * versions (2.3 or before). */ #define _GNU_SOURCE #include <pthread.h> #include <stdio.h> /* fprintf() */ #include <stdlib.h> /* atoi() */ static pthread_barrier_t s_barrier; static pthread_spinlock_t s_spinlock; static int s_iterations; static int s_counter; static void* thread_func(void* arg) { int i; pthread_barrier_wait(&s_barrier); for (i = s_iterations; i > 0; i--) { pthread_spin_lock(&s_spinlock); s_counter++; pthread_spin_unlock(&s_spinlock); } return 0; } int main(int argc, char** argv) { int i; const int n_threads = 10; pthread_t tid[n_threads]; s_iterations = argc > 1 ? atoi(argv[1]) : 1000; fprintf(stderr, "Start of test.\n"); pthread_barrier_init(&s_barrier, 0, n_threads); pthread_spin_init(&s_spinlock, 0); for (i = 0; i < n_threads; i++) pthread_create(&tid[i], 0, thread_func, 0); for (i = 0; i < n_threads; i++) pthread_join(tid[i], 0); pthread_spin_destroy(&s_spinlock); pthread_barrier_destroy(&s_barrier); if (s_counter == n_threads * s_iterations) fprintf(stderr, "Test successful.\n"); else fprintf(stderr, "Test failed: counter = %d, should be %d\n", s_counter, n_threads * s_iterations); return 0; }