#include #include #include #include #include sem_t sem1, sem2; // 信号量 void *task1(void *data) { int *money = (int *)data; // 存款任务 sem_wait(&sem1); // 查询余额 printf("存款任务-余额: %d\n", *money); sleep(1); // 从键盘读取存入的金额 printf("请输入存款金额: "); fflush(stdout); int m; scanf("%d", &m); *money += m; // 修改余额并打印结果 printf("存款成功, 余额为: %d\n", *money); sem_post(&sem2); pthread_exit(NULL); } void *task2(void *data) { int *money = (int *)data; // 取款任务 sem_wait(&sem2); // 查询余额 printf("取款任务-余额: %d\n", *money); sleep(1); // 从键盘读取取出的金额 printf("请输入取款金额: "); fflush(stdout); int m; scanf("%d", &m); if (*money >= m) { *money -= m; // 修改余额并打印结果 printf("取款成功, 余额为: %d\n", *money); } else { printf("取款失败,余额不足\n"); } sem_post(&sem1); pthread_exit(NULL); } int main(int argc, char const *argv[]) { // 初始化信号量 sem_init(&sem1, 0, 1); // 存款的信号量初始化 sem_init(&sem2, 0, 0); // 取款的信号量初始化 int money = 1000; // 存款 while (1) { printf("输入 exit 退出 , 输入其他内容开始存取款\n"); char input[100]; scanf("%s", input); if (strncmp(input, "exit", 4) == 0) { break; } pthread_t tid1, tid2; pthread_create(&tid1, NULL, task1, &money); pthread_create(&tid2, NULL, task2, &money); pthread_join(tid1, NULL); pthread_join(tid2, NULL); } sem_destroy(&sem1); sem_destroy(&sem2); return 0; }