diff options
author | Ulrich Drepper <drepper@redhat.com> | 1998-12-13 18:02:57 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1998-12-13 18:02:57 +0000 |
commit | e3743e2ffdef8246aff171309aa09b65a7ccebd8 (patch) | |
tree | c0fce1a50c576c4b3052e97c47161d302eac4a02 | |
parent | 763babf874f0ea2b712dc688ba2c088d2378e5b6 (diff) | |
download | glibc-e3743e2ffdef8246aff171309aa09b65a7ccebd8.tar.gz glibc-e3743e2ffdef8246aff171309aa09b65a7ccebd8.tar.xz glibc-e3743e2ffdef8246aff171309aa09b65a7ccebd8.zip |
Update.
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.
-rw-r--r-- | linuxthreads/ChangeLog | 6 | ||||
-rw-r--r-- | linuxthreads/Examples/ex3.c | 16 |
2 files changed, 19 insertions, 3 deletions
diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index a6913e9d47..a5d82a43a7 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -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 diff --git a/linuxthreads/Examples/ex3.c b/linuxthreads/Examples/ex3.c index 7557cc7983..8005200eff 100644 --- a/linuxthreads/Examples/ex3.c +++ b/linuxthreads/Examples/ex3.c @@ -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 |