Linux程序开发(十二):线程与多线程同步互斥实现抢票系统

Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊!

喜欢我的博客的话,记得点个红心❤️和小关小注哦!您的支持是我创作的动力!数据源存放在我的资源下载区啦!

Linux程序开发(十二):线程与多线程同步互斥实现抢票系统

目录

  • Linux程序开发(十二):线程与多线程同步互斥实现抢票系统
    • 题目:抢票系统
    • 题目描述:
    • 示例输入:
    • 示例输出:
    • 提示:
    • 解答:
    • 截图:

题目:抢票系统

题目描述:

某公司的演唱会门票正在热销中,为了让用户更好地体验购票过程,公司决定开启一个抢票系统。具体来说,用户可以在系统中选择想要购买的门票数量,系统会随机生成几个购票请求,并给出这些请求的优先级(优先级越高,越先处理)。每个请求需要购买一定数量的门票,如果门票数量已经不足,则该请求将会被拒绝。如果多个请求同时到达,需要按照优先级进行处理。在处理完一个请求后,系统需要输出当前剩余的门票数量。

请你使用Linux下的线程和多线程同步互斥知识,编写一个C程序实现这个抢票系统,要求满足以下条件:
1、系统需要启动两个线程,一个线程代表用户,另一个线程代表抢票程序。
2、用户可以通过命令行输入想要购买的门票数量,抢票程序会自动生成随机的购票请求,并给出优先级。
3、抢票程序需要使用线程池来处理请求,每个请求需要分配一个线程来处理。
4、抢票程序需要使用信号量和互斥锁等机制来实现线程间同步和互斥访问共享资源(如门票数量)。
5、在处理完每个请求后,抢票程序需要输出当前剩余的门票数量。
6、当所有的门票售出后,抢票程序需要结束运行。

示例输入:

请输入购票数量:10

示例输出:

当前剩余门票数量:90
当前剩余门票数量:85
当前剩余门票数量:75
当前剩余门票数量:70
当前剩余门票数量:65
当前剩余门票数量:60
当前剩余门票数量:53
当前剩余门票数量:48
当前剩余门票数量:38

提示:

可以使用Linux系统函数pthread_create()、pthread_join()、pthread_mutex_init()、pthread_mutex_lock()、pthread_mutex_unlock()和pthread_mutex_destroy()来创建和使用线程和互斥锁。
可以使用Linux系统函数sem_init()、sem_wait()、sem_post()和sem_destroy()来创建和使用信号量。

解答:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
#include <semaphore.h>

#define TOTAL_TICKETS 100

// 定义全局变量和互斥锁、信号量
int tickets = TOTAL_TICKETS;
pthread_mutex_t mutex;
sem_t semaphore;

// 定义线程池结构体
typedef struct {
    int priority;
    int num_tickets;
} Request;

void* user_thread(void* arg) {
    // 输入购票数量
    int num_tickets;
    printf("请输入购票数量:");
    scanf("%d", &num_tickets);

    // 等待抢票线程结束
    struct timespec delay = {0, 500000000};  // 500ms
    clock_nanosleep(CLOCK_MONOTONIC, 0, &delay, NULL);

    // 创建抢票请求
    Request* request = (Request*)malloc(sizeof(Request));
    request->priority = 0;  // 用户请求的优先级为最高
    request->num_tickets = num_tickets;

    // 抢票程序处理请求
    pthread_mutex_lock(&mutex);
    if (tickets >= num_tickets) {
        tickets -= num_tickets;
        printf("购票成功!当前剩余门票数量:%d\n", tickets);
    } else {
        printf("购票失败!当前剩余门票数量:%d\n", tickets);
    }
    pthread_mutex_unlock(&mutex);

    free(request);
    return NULL;
}

void* ticket_thread(void* arg) {
    Request* request = (Request*)arg;

    // 模拟处理请求的耗时操作
    struct timespec delay = {request->priority, 0};
    clock_nanosleep(CLOCK_MONOTONIC, 0, &delay, NULL);

    sem_wait(&semaphore);  // 请求抢到票之前等待信号量
    pthread_mutex_lock(&mutex);
    if (tickets >= request->num_tickets) {
        tickets -= request->num_tickets;
        printf("当前剩余门票数量:%d\n", tickets);
    } else {
        printf("请求被拒绝!当前剩余门票数量:%d\n", tickets);
    }
    pthread_mutex_unlock(&mutex);
    sem_post(&semaphore);  // 抢到票后释放信号量

    free(request);
    return NULL;
}
int main() {
    // 初始化互斥锁和信号量
    pthread_mutex_init(&mutex, NULL);
    sem_init(&semaphore, 0, 1);
    // 创建线程池
    pthread_t threads[10];
    // 创建抢票线程
    for (int i = 0; i < 10; i++) {
        Request* request = (Request*)malloc(sizeof(Request));
        request->priority = rand() % 10 + 1;  // 随机生成优先级
        request->num_tickets = rand() % 10 + 1;  // 随机生成购票数量
        pthread_create(&threads[i], NULL, ticket_thread, request);
        struct timespec delay = {0, 50000000};  // 50ms
        clock_nanosleep(CLOCK_MONOTONIC, 0, &delay, NULL); // 睡眠一段时间,防止随机数相同
    }
    // 创建用户线程
    pthread_t user_tid;
    pthread_create(&user_tid, NULL, user_thread, NULL);

    // 等待抢票线程结束
    for (int i = 0; i < 10; i++) {
        pthread_join(threads[i], NULL);
    }
    // 等待用户线程结束
    pthread_join(user_tid, NULL);
    // 清理资源
    pthread_mutex_destroy(&mutex);
    sem_destroy(&semaphore);
    return 0;
}

截图:

在这里插入图片描述
图 3.1 运行结果图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/644627.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

window好用的网速工具

这是一个用于显示当前网速、CPU及内存利用率的桌面悬浮窗软件&#xff0c;并支持任务栏显示&#xff0c;支持更换皮肤。 github链接如下 https://github.com/zhongyang219/TrafficMonitor?tabreadme-ov-file

单窗口一天收益30+ 最新海外炼游地铁跑酷全自动黑科技项目,【软件+使用教程】

随着游戏界的最新狂潮&#xff0c;一款名为“海外酷跑”的游戏引起了全球玩家的关注。它继承了经典的地铁酷跑的精髓&#xff0c;同时注入了一种全新的元素&#xff1a;金币兑换虚拟货币的功能。玩家能够通过积极参与游戏、收集金币来兑换虚拟代币&#xff0c;每达到98000金币就…

详细分析Element中的MessageBox基本知识(附Demo)

目录 前言1. 基本知识2. Demo2.1 确认框2.2 警告框2.3 对话框 3. this.$confirm 前言 详细知识推荐阅读&#xff1a;详细分析Element Plus中的ElMessageBox弹窗用法&#xff08;附Demo及模版&#xff09; MessageBox则常用于Vue2 1. 基本知识 MessageBox 是 Element UI 提供…

每日一题——博弈论(枚举与暴力)

博弈论 题目描述 运行代码 #include<iostream> #include<vector> using namespace std; int main(){int n;cin >> n;vector<int> d(n,0);for(int i 0;i < n;i){cin >> d[i];}vector<int> in(1000,0);for(int k 1;k<3;k){for(int…

SpringBoot 集成 Nebula

工作需求&#xff0c;开始了解图数据库&#xff0c;经过工具选型&#xff0c;最终选择nebula graph&#xff0c;并集成到springboot&#xff0c;java 环境下如何对 Nebula Graph 进行操作&#xff0c;本文整理下过程。 1、首先引入 pom 依赖 <dependency><groupId&g…

【vue】el-select选择器实现宽度自适应

选择器的宽度根据内容长度进行变化 <div class"Space_content"><el-selectv-model"value":placeholder"$t(bot.roommessage)"class"select"size"small"style"margin-right: 10px"change"selectcha…

上5个B端系统的设计规范,让你的开发比着葫芦画瓢。

B端系统设计规范在企业级系统开发中起着重要的作用&#xff0c;具体包括以下几个方面&#xff1a; 统一风格和布局&#xff1a;设计规范能够统一系统的风格和布局&#xff0c;使不同功能模块的界面看起来一致&#xff0c;提升用户的使用体验和学习成本。通过统一的设计规范&am…

AI应用案例:影像报告智能辅助编辑系统

今天给大家介绍一个医疗行业的案例“影像报告智能辅助编辑系统”&#xff01;该案例已经在某三甲医院落地&#xff0c;模型准确度超过80%。 该项目上线后&#xff0c;保守估计&#xff0c;能为每位医生的每一张报告至少省下1分钟时间和2分钟的精力&#xff0c;20位初级医生&…

APP安全测试汇总【网络安全】

APP安全测试汇总 一.安装包签名和证书 1.问题说明 检测 APP 移动客户端是否经过了正确签名&#xff0c;通过检测签名&#xff0c;可以检测出安装包在签名后是否被修改过。如 果 APP 使⽤了 debug 进⾏证书签名&#xff0c;那么 APP 中⼀部分 signature 级别的权限控制就会失效…

材料物理 笔记-9

原内容请参考哈尔滨工业大学何飞教授&#xff1a;https://www.bilibili.com/video/BV18b4y1Y7wd/?p12&spm_id_frompageDriver&vd_source61654d4a6e8d7941436149dd99026962 或《材料物理性能及其在材料研究中的应用》&#xff08;哈尔滨工业大学出版社&#xff09; ——…

【C++练级之路】【Lv.21】C++11——列表初始化和声明

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、列表初始化1.1 内置类型1.2 结构体或类1.3 容器 二、声明2.1 auto2.2 decltype2.3 nullptr 三、STL的…

8个图神经网络的典型用例

虽然 ChatGPT 或 Diffusion 模型等 AI 系统最近备受关注&#xff0c;但图神经网络 (GNN) 却发展迅速。在过去的几年中&#xff0c;GNN 悄然成为众多激动人心的新成就背后的黑马&#xff0c;这些成就从纯学术研究突破一路发展到大规模积极部署的实际解决方案。 Uber、谷歌、阿里…

一文讲解——Java多态

目录 一、什么是多态&#xff1f;二、转型向上转型向下转型 三、方法覆盖与方法重载四、绑定动态绑定静态绑定 五、理解多态 一、什么是多态&#xff1f; 多态的词组字面意思是&#xff1a; 某种事物多种形态。 但是对于我们学习Java 的程序原来说&#xff0c;就不不能简单这样…

2024目前网上最火短剧机器人做法,自动搜索发剧 自动更新资源 自动分享资源

目前整个项目圈子很多的短剧机器人&#xff0c;我写的&#xff0c;自动搜索发剧&#xff0c;自动更新资源&#xff0c;自动分享资源&#xff0c;前段时间大部分做短剧的都是做的短剧分成&#xff0c;我的一个学员做的30W播放量才200块收益&#xff0c;备受启发&#xff0c;我就…

HCIP-Datacom-ARST自选题库__MPLS多选【25道题】

1.下列描述中关于MPLS网络中配置静态LSP正确的是 当某一台LSR为Egress LSR时&#xff0c;1仅需配置In Label&#xff0c;范围为16~1023 当某一台LSR为Transit LSR时&#xff0c;需要同时配置In Label和Out label&#xff0c;In Label范围为16~1023&#xff0c;0utLabel范围为…

Keyshot v11 解锁版安装教程 (3D光线追踪与全域光渲染程序)

前言 keyshot是一款实时渲染模式的软件。实时渲染是目前比较流行的一种渲染方式&#xff0c;优点是快速。调节的材质&#xff0c;灯光修改&#xff0c;光影变化等修改的各种参数结果&#xff0c;所见即所得&#xff0c;意思是你在软件操作界面看到的&#xff0c;就是最终的结果…

leetcode每日一题第八十九天

class Solution { public:int subarraySum(vector<int>& nums, int k) {unordered_map<int,int> mp;mp[0] 1;int count 0,pre 0;for(auto x:nums){pre x;if(mp.find(pre-k) ! mp.end()){count mp[pre-k];}mp[pre];}return count;} };

爬虫100个Python例子优化

今天看到一个Python 100例的在线资源,感觉每个都需要去点,太费时间了,于是,使用Python将数据爬取下来,方便查看。实际效果如下: 。。。。。。 用了13分钟,当然,这是优化后的效果,如果没有优化,需要的时间更长。 爬取url如下: https://www.runoob.com/python/pytho…

计算机毕业设计Hadoop+Hive地震预测系统 地震数据分析可视化 地震爬虫 大数据毕业设计 Spark 机器学习 深度学习 Flink 大数据

2024 届本科毕业论文&#xff08;设计&#xff09; 基于Hadoop的地震预测的 分析与可视化研究 姓 名&#xff1a;____田伟情_________ 系 别&#xff1a;____信息技术学院___ 专 业&#xff1a;数据科学与大数据技术 学 号&#xff1a;__2011103094________ 指导…

【算法】递归、搜索与回溯——简介

简介&#xff1a;递归、搜索与回溯&#xff0c;本节博客主要是简单记录一下关于“递归、搜索与回溯”的相关简单概念&#xff0c;为后续算法做铺垫。 目录 1.递归1.1递归概念2.2递归意义2.3学习递归2.4写递归代码步骤 2.搜索3.回溯与剪枝 递归、搜索、回溯的关系&#xff1a; …