diff options
author | Sanjit Bhat <[email protected]> | 2023-09-13 02:01:38 -0400 |
---|---|---|
committer | Sanjit Bhat <[email protected]> | 2023-09-13 02:01:38 -0400 |
commit | 87470490676ee6dc087e3ebe2a3ce3cfbd4afbd9 (patch) | |
tree | 64398d88609ac3b9fc045071ae6703269c97ce26 /notxv6/barrier.c | |
parent | 74c1eba516fdb0ec1a17b16be7e76613ccba92bf (diff) | |
download | xv6-labs-87470490676ee6dc087e3ebe2a3ce3cfbd4afbd9.tar.gz xv6-labs-87470490676ee6dc087e3ebe2a3ce3cfbd4afbd9.tar.bz2 xv6-labs-87470490676ee6dc087e3ebe2a3ce3cfbd4afbd9.zip |
release lab thread
Diffstat (limited to 'notxv6/barrier.c')
-rw-r--r-- | notxv6/barrier.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/notxv6/barrier.c b/notxv6/barrier.c new file mode 100644 index 0000000..12793e8 --- /dev/null +++ b/notxv6/barrier.c @@ -0,0 +1,78 @@ +#include <stdlib.h> +#include <unistd.h> +#include <stdio.h> +#include <assert.h> +#include <pthread.h> + +static int nthread = 1; +static int round = 0; + +struct barrier { + pthread_mutex_t barrier_mutex; + pthread_cond_t barrier_cond; + int nthread; // Number of threads that have reached this round of the barrier + int round; // Barrier round +} bstate; + +static void +barrier_init(void) +{ + assert(pthread_mutex_init(&bstate.barrier_mutex, NULL) == 0); + assert(pthread_cond_init(&bstate.barrier_cond, NULL) == 0); + bstate.nthread = 0; +} + +static void +barrier() +{ + // YOUR CODE HERE + // + // Block until all threads have called barrier() and + // then increment bstate.round. + // + +} + +static void * +thread(void *xa) +{ + long n = (long) xa; + long delay; + int i; + + for (i = 0; i < 20000; i++) { + int t = bstate.round; + assert (i == t); + barrier(); + usleep(random() % 100); + } + + return 0; +} + +int +main(int argc, char *argv[]) +{ + pthread_t *tha; + void *value; + long i; + double t1, t0; + + if (argc < 2) { + fprintf(stderr, "%s: %s nthread\n", argv[0], argv[0]); + exit(-1); + } + nthread = atoi(argv[1]); + tha = malloc(sizeof(pthread_t) * nthread); + srandom(0); + + barrier_init(); + + for(i = 0; i < nthread; i++) { + assert(pthread_create(&tha[i], NULL, thread, (void *) i) == 0); + } + for(i = 0; i < nthread; i++) { + assert(pthread_join(tha[i], &value) == 0); + } + printf("OK; passed\n"); +} |