Skip to content

Commit

Permalink
Update.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Ulrich Drepper committed Dec 13, 1998
1 parent 763babf commit e3743e2
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 3 deletions.
6 changes: 6 additions & 0 deletions linuxthreads/ChangeLog
Original file line number Diff line number Diff line change
@@ -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
Expand Down
16 changes: 13 additions & 3 deletions linuxthreads/Examples/ex3.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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++)
Expand Down Expand Up @@ -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);
Expand All @@ -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
Expand Down

0 comments on commit e3743e2

Please sign in to comment.