106 lines
2.3 KiB
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;
|
|
}
|