卖票——多线程模拟卖票系统

来源:互联网 发布:编程猫可以加盟吗 编辑:程序博客网 时间:2024/05/16 12:14

网上抢票,方便又高效,很舒服。应用多线程的同步运行可以模拟很多人抢票,而且不会发生冲突。下面,我们就来利用多线程来模拟一把。

#include <stdio.h>#include <stdlib.h>#include <pthread.h>int Tickets = 100;      //定义票数为全局变量,所以线程都可访问pthread_mutex_t mutex;  //定义互斥锁void delay()        //自定义延迟函数,不可使用sleep{    int x = rand() % 30000;    int y;    while(x > 0)    {        y = rand() % 30000;        while (y > 0)        {            y--;        }        x--;    }}void *SaleTicket(void *arg){    int cur_ticket;     //定义当前票数    while(1)    {        pthread_mutex_lock(&mutex); //加锁        cur_ticket = Tickets;        if (cur_ticket <= 0)        {            pthread_mutex_unlock(&mutex);            break;        }        printf("当前票数为:%d\n", cur_ticket);        delay();    //随机延迟        cur_ticket--;        Tickets = cur_ticket;   //把当前票数返回给全局变量,让所有线程都知道        pthread_mutex_unlock(&mutex);   //解锁    }}int main(){    pthread_t tid[5] = {0};     //定义5个线程ID    int ret, i;    srand(time(NULL));      //初始化随机函数    ret = pthread_mutex_init(&mutex, NULL); //初始化互斥锁    if (0 != ret)   //初始化失败返回0    {        perror("pthread_mutex_init");        exit(1);    }    for (i= 0; i < 5; i++)  //模拟5个线程同时运行    {        ret = pthread_create(&tid[i], NULL, SaleTicket, NULL);  //创建线程        if (0 != ret)   //创建失败        {            perror("pthread_create");            exit(1);        }    }    for(i = 0; i < 5; i++)    {        pthread_join(tid[i], NULL); //线程等待    }    pthread_mutex_destroy(&mutex);  //最后销毁互斥锁    return 0;}

运行结果:
这里写图片描述

这里写图片描述

原创粉丝点击