Linux利用锁机制实现火车票售卖功能

#include<43func.h>
typedef struct shareRes_s{
    int trainTicket;
    pthread_mutex_t mutex;
} shareRes_t;
//1号窗口
void *sellTicket1(void *arg){
    shareRes_t * pShareRes = (shareRes_t *)arg;
    int cnt = 0;
    while(1){
        pthread_mutex_lock(&pShareRes->mutex);
        if(pShareRes->trainTicket <= 0){
            //在所有离开循环的场景,记得解锁
            pthread_mutex_unlock(&pShareRes->mutex);
            break;
        }
        //1号窗口售出一张票之前,车票余票还有多少
        printf("before 1 sell ticket, num = %d\n", pShareRes->trainTicket);
        --pShareRes->trainTicket;
        cnt++;
        //1号窗口售出一张票之后,车票余票还有多少
        printf("after 1 sell ticket, num = %d\n", pShareRes->trainTicket);
        pthread_mutex_unlock(&pShareRes->mutex);
    }
    printf("sellticket1 = %d\n", cnt); 
}
//2号窗口
void *sellTicket2(void *arg){
    shareRes_t * pShareRes = (shareRes_t *)arg;
    int cnt = 0;
    while(1){
        pthread_mutex_lock(&pShareRes->mutex);
        if(pShareRes->trainTicket <= 0){
            //在所有离开循环的场景,记得解锁
            pthread_mutex_unlock(&pShareRes->mutex);
            break;
        }
        //2号窗口
        printf("before 2 sell ticket, num = %d\n", pShareRes->trainTicket);
        --pShareRes->trainTicket;
        cnt++;
        printf("after 2 sell ticket, num = %d\n", pShareRes->trainTicket);
        pthread_mutex_unlock(&pShareRes->mutex);
    }
    printf("sellticket2 = %d\n", cnt);
}
int main(){
    shareRes_t shareRes;
    shareRes.trainTicket = 20000;
    pthread_mutex_init(&shareRes.mutex,NULL);
    pthread_t tid1, tid2;
    //创建两个线程
    pthread_create(&tid1,NULL,sellTicket1,(void *)&shareRes);
    pthread_create(&tid2,NULL,sellTicket2,(void *)&shareRes);
    //对线程资源进行回收
    pthread_join(tid1,NULL);
    pthread_join(tid2,NULL);
    pthread_mutex_destroy(&shareRes.mutex);
}

当票数容量较小的时候,会出现一边倒的情况(即全部由一个窗口售卖),这是不符合现实情况的,有人就会有疑问,这个锁不公平吧?

其实不是的,当我们把车票容量调大一些,会得到如下的情况

1.比如20000张票  此时两个窗口售票就比较均匀了 窗口1售出10778张票 窗口2售出9222张票

2.比如200000张票,窗口1售出101426张票 窗口2售出98574张票

由此可见锁是公平的!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,我来帮你解决这个问题。首先,我们需要先定义一个共享资源,也就是商洛到宁波的火车票总数。然后,我们需要创建三个线程,分别模拟三个售票点。在每个线程中,我们需要加锁来保证同一时刻只有一个线程能够访问共享资源。每个线程的售票过程如下: 1. 判断当前剩余的火车票数量是否大于0,如果是,继续执行;否则,退出售票过程。 2. 从火车票总数中减去1,代表售出了一张火车票。 3. 打印出当前售票点售出的票数以及剩余的票数。 下面是一个示例代码: ```python import threading ticket_count = 200 lock = threading.Lock() def sell_tickets(name): global ticket_count while ticket_count > 0: lock.acquire() if ticket_count > 0: ticket_count -= 1 print("{}售出了1张票,剩余{}张票".format(name, ticket_count)) lock.release() if __name__ == "__main__": t1 = threading.Thread(target=sell_tickets, args=("售票点1",)) t2 = threading.Thread(target=sell_tickets, args=("售票点2",)) t3 = threading.Thread(target=sell_tickets, args=("售票点3",)) t1.start() t2.start() t3.start() t1.join() t2.join() t3.join() ``` 在上面的代码中,我们创建了三个线程,分别代表三个售票点。每个线程执行的函数是 `sell_tickets`,其中 `name` 参数代表售票点的名称。在函数中,我们首先获得锁,然后判断当前剩余的票数是否大于0。如果是,就从总票数中减去1,然后打印出当前售票点售出的票数以及剩余的票数。最后,释放锁,让其他线程能够访问共享资源。 当我们运行这个程序时,会看到三个售票点同时卖票,直到所有的火车票都售完为止。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值