fix synchro mechanism
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Tue, 21 Oct 2025 13:09:30 +0000 (15:09 +0200)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Tue, 21 Oct 2025 13:09:30 +0000 (15:09 +0200)
mutex.c
semaphore.c

diff --git a/mutex.c b/mutex.c
index bef47f1a838f8e8fabe6cf24cdb85f8233fc0260..b40045da8cde368cb00fde8beb053e56d66e3909 100644 (file)
--- a/mutex.c
+++ b/mutex.c
@@ -3,6 +3,7 @@
 /* linker: mtime.o test.o stat.o -lm -lpthread -lrt */
 
 #include <pthread.h>
+#include <semaphore.h>
 #include <stdio.h>
 #include <unistd.h>
 
@@ -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;
 }
index e78566b984f0f87e7dc998277c0c8d2960f4aad4..7d1cf3890db95c00770a06e05c9e3fee4fe341c7 100644 (file)
@@ -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;
 }