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

embedded/2024/9/25 23:18:33/

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};  // 500msclock_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};  // 50msclock_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 运行结果图


http://www.ppmy.cn/embedded/44018.html

相关文章

安装mysql的MGR集群

说明 1、 mysql数据库主从宕机&#xff0c;会影响到正常业务访问&#xff0c;并且要手动进行切换。 2、 MHA高可用搭建复杂&#xff0c;代码已停止更新。 3、 MGR集群搭建方便&#xff0c; master故障会自动进行切换&#xff0c;不影响业务正常访问。 一、环境准备 1、主机说明…

BurpGPT工具分享

相关链接 BurpGPT&#xff1a;https://burpgpt.app/ GitHub&#xff1a;https://github.com/aress31/burpgpt 功能概述 BurpGPT Pro(07/05/2023-01/04/2024) BurpGPT 是我们的 Burp Suite 扩展&#xff0c;集成了 OpenAI 的 LLMs&#xff0c;可用于高级漏洞扫描和基于流量的…

【Linux】Socket中的心跳机制(心跳包)

Socket中的心跳机制(心跳包) 1. 什么是心跳机制&#xff1f;(心跳包) 在客户端和服务端长时间没有相互发送数据的情况下&#xff0c;我们需要一种机制来判断连接是否依然存在。直接发送任何数据包可以实现这一点&#xff0c;但为了效率和简洁&#xff0c;通常发送一个空包&am…

echarts快速入门

之前只看过&#xff0c;没写过&#xff0c;来了个新需求了解下echarts功能 官网&#xff1a;https://echarts.apache.org/handbook/zh/get-started 官方参数文档&#xff1a;https://echarts.apache.org/zh/option.html#title 其实大部分问题&#xff0c;去官方参数文档里面都…

什么是 ISP 代理?

代理是路由互联网流量的中间服务器&#xff0c;通常分为三类&#xff1a;数据中心、住宅和 ISP。根据定义&#xff0c;ISP 代理隶属于互联网服务提供商&#xff0c;但实际上&#xff0c;更容易将它们视为数据中心和住宅代理的组合。 让我们仔细研究一下 ISP 代理&#xff0c;看…

研发机构大数据迁移如何保障敏感数据不泄露

随着云计算和大数据技术的飞速进步&#xff0c;越来越多的企业正试图通过数据迁移来提升IT基础设施的效率&#xff0c;减少成本&#xff0c;并增强业务的灵活性。但是&#xff0c;这一过程并非没有它的挑战&#xff0c;尤其是在数据安全方面。数据在转移过程中可能会遭遇黑客攻…

DNSlog环境搭建

阿里云域名公网VPS地址 购买阿里云域名后设置“自定义DNSHOST” DNS服务器填写ns1和ns2 如&#xff1a;ns1.aaa.com IP地址填写你的VPS地址 如&#xff1a;1.1.1.1 填写解析记录&#xff0c;一个A记录、一个NS记录 NS记录就是*.域名指向记录值ns1.域名 如&#xff1a;*.aaa…

MVC架构中的servlet层重定向404小坑

servlet层中的UserLoginServlet.java package com.mhys.servlet; /*** ClassName: ${NAME}* Description:** Author 数开_11* Create 2024-05-29 20:32* Version 1.0*/import com.mhys.pojo.User; import com.mhys.service.UserService; import com.mhys.service.impl.UserSer…