]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Update.
authorUlrich Drepper <drepper@redhat.com>
Sun, 13 Dec 1998 18:02:57 +0000 (18:02 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sun, 13 Dec 1998 18:02:57 +0000 (18:02 +0000)
1998-12-13  Ulrich Drepper  <drepper@cygnus.com>

* Examples/ex3.c: Wait until all threads are started before
searching for the number to avoid race condition on very fast
systems.

linuxthreads/ChangeLog
linuxthreads/Examples/ex3.c

index a6913e9d47a0542acc84e9f34682db09f7547e07..a5d82a43a7bd05eaf292b68d4dd91b5e53c144b2 100644 (file)
@@ -1,3 +1,9 @@
+1998-12-13  Ulrich Drepper  <drepper@cygnus.com>
+
+       * Examples/ex3.c: Wait until all threads are started before
+       searching for the number to avoid race condition on very fast
+       systems.
+
 1998-12-08  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
 
        * sysdeps/pthread/pthread.h: Remove __pthread_setcanceltype
index 7557cc79838ac0b15b2677f2abf5459a121505f6..8005200eff84ab2513f96a064e1dc590c31f7e4d 100644 (file)
@@ -19,6 +19,7 @@ void print_it(void *);
 pthread_t threads[NUM_THREADS];
 pthread_mutex_t lock;
 int tries;
+volatile int started;
 
 int main(int argc, char ** argv)
 {
@@ -33,8 +34,8 @@ int main(int argc, char ** argv)
   pthread_mutex_init(&lock, NULL);
 
   /* Create the searching threads */
-  for (i=0; i<NUM_THREADS; i++)
-    pthread_create(&threads[i], NULL, search, (void *)pid);
+  for (started=0; started<NUM_THREADS; started++)
+    pthread_create(&threads[started], NULL, search, (void *)pid);
 
   /* Wait for (join) all the searching threads */
   for (i=0; i<NUM_THREADS; i++)
@@ -74,7 +75,13 @@ void *search(void *arg)
 
   /* use the thread ID to set the seed for the random number generator */
   /* Since srand and rand are not thread-safe, serialize with lock */
-  pthread_mutex_lock(&lock);
+
+  /* Try to lock the mutex lock --
+     if locked, check to see if the thread has been cancelled
+     if not locked then continue */
+  while (pthread_mutex_trylock(&lock) == EBUSY)
+    pthread_testcancel();
+
   srand((int)tid);
   i = rand() & 0xFFFFFF;
   pthread_mutex_unlock(&lock);
@@ -87,6 +94,9 @@ void *search(void *arg)
   pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
   pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
 
+  while (started < NUM_THREADS)
+    sched_yield ();
+
   /* Push the cleanup routine (print_it) onto the thread
      cleanup stack.  This routine will be called when the
      thread is cancelled.  Also note that the pthread_cleanup_push