#include <stdio.h> #include <stdlib.h> #include <time.h> #include <unistd.h> #include <pthread.h> #include <semaphore.h> #define SEAT_NUM 2 #define CUSTOMER_NUM 10 sem_t empty_seat_num; int customer_state[CUSTOMER_NUM] = {0}; void sleep_random(int t) { sleep((int)(t * (rand() / (RAND_MAX *1.0)))); } void print_cur_state() { int i; printf(" customers with seats: ("); for (i = 0; i < CUSTOMER_NUM; i++) { if (0 != customer_state[i]) printf(" %d", i+1); } printf(" )\n"); } void *customer(void *id) { const int myid = (int)id; sleep_random(2); printf("customer %d: try to get a seat...\n", myid); sem_wait(&empty_seat_num); printf("customer %d: sit down\n", myid); customer_state[myid-1] = 1; print_cur_state(); sleep_random(3); printf("customer %d: stand up\n", myid); customer_state[myid-1] = 0; print_cur_state(); sem_post(&empty_seat_num); } int main() { int i, id[CUSTOMER_NUM], res; pthread_t t[CUSTOMER_NUM]; srand((int)time(0)); sem_init(&empty_seat_num, 0, SEAT_NUM); for (i = 0; i < CUSTOMER_NUM; i++) { id[i] = i + 1; pthread_create(&t[i], NULL, customer, &id[i]); } for (i = 0; i < CUSTOMER_NUM; i++) { res = pthread_join(t[i], NULL); if (res != 0){ perror("failed to join thread"); exit(2); } } return 0; } 什么意思
时间: 2024-04-23 19:25:30 浏览: 201
这是一个使用 pthread 和 semaphore 实现的简单线程同步问题。程序模拟了一个餐厅只有两个座位的场景,有 10 个顾客需要等待座位。每个顾客线程会先等待一个随机时间,然后尝试获取一个座位,如果有空位则坐下,否则等待。当顾客坐下或者离开时,都需要更新座位状态和输出当前座位状态。主线程创建 10 个顾客线程,并等待它们执行完毕。在程序中,使用了一个信号量 empty_seat_num 来表示空位数量,当空位数为 0 时,顾客需要等待。使用了一个全局数组 customer_state 来表示每个顾客的座位状态,其中 0 表示没有座位,1 表示已有座位。
相关问题
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <unistd.h> #include <pthread.h> #include <semaphore.h> void sleep_random(int t) { sleep((int)(t * (rand() / (RAND_MAX *1.0)))); } void delay(){ int i = 10000000; while (i--) ; } #define N 5 sem_t chopstick[N]; void *phi(void *id){ /* 'id' starts from 1 */ int i, left, right, myid = *(int*)id; left = myid - 1; right = (myid < N) ? myid : 0; for (i = 0; i < 3; i++){ printf("phi #%d: thinking\n", myid); if (left < right){ sem_wait(&chopstick[left]); delay(); sem_wait(&chopstick[right]); } else{ sem_wait(&chopstick[right]); delay(); sem_wait(&chopstick[left]); } printf("phi #%d: eating\n", myid); sleep_random(3); sem_post(&chopstick[left]); sem_post(&chopstick[right]); } } int main(){ int i, id[N]; pthread_t t[N]; srand((int)time(0)); for (i = 0; i < N; i++){ id[i] = i + 1; sem_init(&chopstick[i], 0, 1); } for (i = 0; i < N; i++) pthread_create(&t[i], NULL, phi, &id[i]); for (i = 0; i < N; i++) pthread_join(t[i], NULL); return 0; } 什么意思
这是一个使用 pthread 和 semaphore 实现的哲学家就餐问题。程序模拟了 5 个哲学家围坐在一张圆桌前,每个哲学家需要使用他左右两边的筷子才能进餐。每个哲学家线程会先思考一段时间,然后尝试获取他左右两边的筷子,如果两个筷子都被占用,则等待。当哲学家成功获取两个筷子并进餐时,会持有两个筷子信号量,直到进餐结束后释放。主线程创建 5 个哲学家线程,并等待它们执行完毕。在程序中,使用了 5 个信号量 chopstick 来表示每个筷子的占用状态,初始时每个筷子都是可用的。当哲学家需要使用筷子时,会先尝试获取左右两边的筷子信号量,如果坐在 5 号位置的哲学家需要使用 1 号和 5 号两个筷子,则会先等待获取 5 号筷子的信号量,避免死锁。如果同时有多个哲学家都试图获取同一对筷子,可能会发生死锁,因此需要使用适当的算法,如 Dijkstra 算法来避免死锁。
讲解如下代码:#include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <stdlib.h> #include <arpa/inet.h> #include <strings.h> #include <time.h> #include <string.h> #include <sys/time.h> #include <unistd.h> void print_time_usec() { struct tm
这段代码是一个简单的 C 语言程序,于打印当前时间的微秒部分。它包含了一些头文件的引用,例如stdio.h、sys/types.h、sys/socket.h等,这些头文件提供了一些函数和数据类型的定义,供后面的代码使用。
在主函数之外,有一个名为print_time_usec的函数。该函数用于获取当前时间的微秒部分,并将其打印出来。函数内部使用了struct tm结构体来存储时间信息,并通过time函数获取当前时间。然后,使用gettimeofday函数获取当前时间的微秒部分,并将其打印出来。
这段代码还使用了一些其他的函数,例如bzero函数用于将结构体清零,inet_addr函数用于将字符串形式的IP地址转换为网络字节序的整数形式,等等。整个代码的功能是获取当前时间的微秒部分并打印出来。
阅读全文