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

89 lines
1.9 KiB
C
Raw Permalink Normal View History

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>
#include <string.h>
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;
}