操作系统实验——和尚打水问题

    技术2024-03-20  78

    代码在gcc运行

    #include <stdio.h> #include <pthread.h> #include<semaphore.h> #include<unistd.h> sem_t empty, full, bucket; pthread_mutex_t well, jar; int jar_count = 0; void *producer(void *arg) { while (1) { sleep(1); sem_wait(&empty); sem_wait(&bucket); pthread_mutex_lock(&well); printf("get water from well."); pthread_mutex_unlock(&well); pthread_mutex_lock(&jar); jar_count++; printf("put water in jar.the jar_count is %d\n", jar_count); pthread_mutex_unlock(&jar); sem_post(&full); sem_post(&bucket); } } void *consumer(void *arg) { while (1) { sleep(2); sem_wait(&full); sem_wait(&bucket); pthread_mutex_lock(&jar); jar_count--; printf("get water from jar.the jar_count is %d\n", jar_count); pthread_mutex_unlock(&jar); sem_post(&empty); sem_post(&bucket); } } int main(int argc, char *argv[]) { pthread_t thrd_producer, thrd_consumer; pthread_mutex_init(&well, NULL); pthread_mutex_init(&jar, NULL); sem_init(&empty, 0, 10); sem_init(&full, 0, 0); sem_init(&bucket, 0, 3); if (pthread_create(&thrd_producer, NULL, producer, NULL) != 0) printf("thread create failed."); if (pthread_create(&thrd_consumer, NULL, consumer, NULL) != 0) printf("thread create failed."); if (pthread_join(thrd_producer, NULL) != 0) printf(" wait thread failed."); if (pthread_join(thrd_consumer, NULL) != 0) printf(" wait thread failed."); sem_destroy(&full); sem_destroy(&empty); sem_destroy(&bucket); pthread_mutex_destroy(&well); pthread_mutex_destroy(&jar); return 0; }

    Processed: 0.017, SQL: 9