qfedu-linux-advanced-level/day7/sem_2.c

106 lines
2.3 KiB
C

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
#include <semaphore.h>
// 信号量实例 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;
}