89 lines
1.9 KiB
C
89 lines
1.9 KiB
C
#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;
|
|
}
|