#include #include #include #include #include // 信号量实例 2 - 存取款 sem_t sem; // 定义信号量 int money = 1000; // 存款余额 int exit_flag = 0; // 退出标志 void *task1(void *data) { while (1) { sem_wait(&sem); // P 操作 // 查询余额 printf("存款任务-余额: %d\n", money); usleep(200 * 1000); // 从键盘读取存入的金额 printf("请输入存款金额 (输入 0 结束存款): "); fflush(stdout); int m; scanf("%d", &m); if (m == 0) { exit_flag = 1; sem_post(&sem); // V 操作 break; } money += m; // 修改余额并打印结果 printf("存款成功, 余额为 %d\n", money); sem_post(&sem); // V 操作 } pthread_exit(NULL); } void *task2(void *data) { while (1) { sem_wait(&sem); // P 操作 // 查询余额 printf("取款任务-余额: %d\n", money); usleep(200 * 1000); // 从键盘读取取出的金额 printf("请输入取款金额 (输入 0 结束取款): "); fflush(stdout); int m; scanf("%d", &m); if (m == 0) { exit_flag = 1; sem_post(&sem); // V 操作 break; } if (money >= m) { money -= m; // 修改余额并打印结果 printf("取款成功, 余额为 %d\n", money); } else { printf("取款失败, 余额不足\n"); } sem_post(&sem); // V 操作 } pthread_exit(NULL); } int main(int argc, char const *argv[]) { // 初始化信号量 sem_init(&sem, 0, 1); while (1) { pthread_t t1, t2; pthread_create(&t1, NULL, task1, NULL); pthread_create(&t2, NULL, task2, NULL); while (1) { sem_wait(&sem); // P 操作 if (exit_flag) { sem_post(&sem); // V 操作 break; } sem_post(&sem); // V 操作 } pthread_join(t1, NULL); pthread_join(t2, NULL); } // 销毁信号量 sem_destroy(&sem); return 0; }