mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 08:26:14 +00:00
58 lines
1.3 KiB
C
58 lines
1.3 KiB
C
/** 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;
|
|
}
|