From 5e0651411539e7189a1a0d18060b48857739272e Mon Sep 17 00:00:00 2001 From: Laurent MAZET Date: Tue, 21 Oct 2025 15:09:30 +0200 Subject: [PATCH] fix synchro mechanism --- mutex.c | 40 ++++++++++++++++++---------------------- semaphore.c | 32 +++++++------------------------- 2 files changed, 25 insertions(+), 47 deletions(-) diff --git a/mutex.c b/mutex.c index bef47f1..b40045d 100644 --- a/mutex.c +++ b/mutex.c @@ -3,6 +3,7 @@ /* linker: mtime.o test.o stat.o -lm -lpthread -lrt */ #include +#include #include #include @@ -19,11 +20,10 @@ void (*usage_ext) (FILE *) = NULL; int (*parse_arg_ext) (char *) = NULL; pthread_barrier_t *barrier = NULL; +sem_t sem; pthread_mutex_t test = PTHREAD_MUTEX_INITIALIZER; volatile int shared_flag = 0; -ts_t ts1, ts2; -int try = 0; -int nbtoofast = 0; +ts_t ts1={0}, ts2={0}; int rc = 0; #define TIMER 1000 @@ -33,14 +33,16 @@ void *ping (__attribute__((unused)) void *arg) pthread_barrier_wait (barrier); - while (try < nb_measurements) { + for (int i = -1; i < nb_measurements; i++) { + + usleep (TIMER); pthread_mutex_lock (&test); + + sem_post (&sem); usleep (TIMER); - shared_flag = 1; + sys_timestamp (&ts1); pthread_mutex_unlock (&test); - //shared_flag = 0; - usleep (TIMER); } pthread_exit (NULL); @@ -51,19 +53,13 @@ void *pong (__attribute__((unused)) void *arg) pthread_barrier_wait (barrier); - while (try < nb_measurements) { - ts_t ts; - sys_timestamp (&ts); + for (int i = -1; i < nb_measurements; i++) { + + sem_wait (&sem); + pthread_mutex_lock (&test); - if (shared_flag) { - sys_timestamp (&ts2); - if (diff_timestamp (&ts2, &ts) < (9 * TIMER / 10)) { - nbtoofast++; - } else { - deltas[try++] = diff_timestamp (&ts2, &ts1); - } - shared_flag = 0; - } + sys_timestamp (&ts2); + if (i != -1) deltas[i] = diff_timestamp (&ts2, &ts1); pthread_mutex_unlock (&test); } @@ -79,7 +75,7 @@ int init (dts_t *buffer, int nb, pthread_barrier_t *synchro) nb_measurements = nb; barrier = synchro; - shared_flag = 1; + sem_init (&sem, 0, 1); return 0; } @@ -87,7 +83,7 @@ int init (dts_t *buffer, int nb, pthread_barrier_t *synchro) int finish () { - printf ("Too fast: %d\n", nbtoofast); + sem_destroy (&sem); - return rc || nbtoofast; + return rc; } diff --git a/semaphore.c b/semaphore.c index e78566b..7d1cf38 100644 --- a/semaphore.c +++ b/semaphore.c @@ -26,8 +26,6 @@ pthread_barrier_t *barrier = NULL; volatile int shared_flag = 0; ts_t ts1, ts2; sem_t sem; -int try = 0; -int nbtoofast = 0; int rc = 0; #define TIMER 1000 @@ -37,14 +35,11 @@ void *ping (__attribute__((unused)) void *arg) pthread_barrier_wait (barrier); - while (try < nb_measurements) { - sem_wait (&sem); + for (int i = -1; i < nb_measurements; i++) { + usleep (TIMER); - shared_flag = 1; sys_timestamp (&ts1); sem_post (&sem); - //shared_flag = 0; - usleep (TIMER); } pthread_exit (NULL); @@ -55,20 +50,11 @@ void *pong (__attribute__((unused)) void *arg) pthread_barrier_wait (barrier); - while (try < nb_measurements) { - ts_t ts; - sys_timestamp (&ts); + for (int i = -1; i < nb_measurements; i++) { + sem_wait (&sem); - if (shared_flag) { - sys_timestamp (&ts2); - if (diff_timestamp (&ts2, &ts) < (9 * TIMER / 10)) { - nbtoofast++; - } else { - deltas[try++] = diff_timestamp (&ts2, &ts1); - } - shared_flag = 0; - } - sem_post (&sem); + sys_timestamp (&ts2); + if (i != -1) deltas[i] = diff_timestamp (&ts2, &ts1); } pthread_exit (NULL); @@ -87,8 +73,6 @@ int init (dts_t *buffer, int nb, pthread_barrier_t *synchro) sem_init (&sem, 0, 1); - shared_flag = 1; - return 0; } @@ -97,7 +81,5 @@ int finish () sem_destroy (&sem); - printf ("Too fast: %d\n", nbtoofast); - - return rc || nbtoofast; + return rc; } -- 2.30.2