实现线程安全的UnblockQueue

SpringBoot+Vue+Mysql社区医院信息平台(源码+文档) SpringBoot+Vue+Mysql学生宿舍信息管理系统 WEB端软件项目(源码+文档) 项目包含:①完整源码(后端+管理后台+用户前台);②数据库脚本文件;③万字论文文档;④开题报告;⑤答辩PPT;⑥项目运行视频教程。 项目架构: B/S 架构、MVC 分层设计 技术栈: Java、MySQL、SpringBoot、MyBatis-Plus、Token 权限校验、管理后台 Vue+ElementUI+ECharts、用户前台 Layui+jQuery、Maven 构建。 一、角色设计 学生用户: 注册登录、浏览宿舍信息、查询宿舍安排、在线报修、缴费查询、失物招领、桶装水预订、评论交流、收藏等。 商家用户: 注册登录、桶装水品牌与商品信息维护、预订订单查看与处理。 维修人员: 注册登录、查看待处理报修、接单维修、填写报修处理结果与进度反馈。 管理员: 学生管理、班级管理、宿舍信息管理、宿舍安排管理、报修处理管理、缴费信息管理、卫生检查与文明宿舍管理、失物招领管理、桶装水与商家管理、维修人员管理、公告资讯与轮播图管理等。 二、前台功能模块(学生端) 1. 首页展示:轮播图、宿舍公告、最新动态推荐、常用服务快速入口 2. 宿舍信息模块:宿舍列表、楼栋与房间条件筛选、宿舍详情查看、我的宿舍安排查询 3. 在线报修模块:在线提交宿舍设施报修申请、上传故障描述、查看报修进度与维修处理结果 4. 缴费模块:水电等缴费记录查询、缴费状态查看 5. 卫生检查与文明宿舍:宿舍卫生检查结果公示、文明宿舍展示 6. 失物招领模块:失物信息发布、招领信息发布、详情查看、评论互动 7. 桶装水预订:桶装水品牌与商品浏览、在线预订、我的预订记录查询 8. 假期留宿:假期留校申请提交、申请记录查询 9. 评论与收藏:信息评论、查看他人评论、评论回复互动、收藏感兴趣的内容 10. 个人中心... 立即下载

目标:实现两个生产者线程产生随机数,一个消费者线程处理产生的随机数。
实现:实现三个类,分别是消费者 Customer,生产者 Productor,工具类 UnblockQueue

UnblockQueue类 (线程安全队列,没数据的时候消费者线程等待)

UnblockQueue.h

#pragma once
#include <queue>
#include <mutex>
#include <condition_variable>
template <typename T>
class UnblockQueue {
public:
    UnblockQueue()
        :m_mutex(), m_cond(), m_queue(), m_unblock(false)
    {

    }

    void Push(T item)
    {
        std::unique_lock<std::mutex> lock(m_mutex);
        m_queue.push(item);
        m_cond.notify_one();
    }

    T Pop()
    {
        std::unique_lock<std::mutex> lock(m_mutex);
        while (m_queue.empty() && !m_unblock)
        {
            m_cond.wait(lock);
        }

        if (m_unblock)
        {
            m_unblock = false;
            return nullptr;
        }
        auto item = m_queue.front();
        m_queue.pop();
        return item;
    }

    size_t Size()
    {
        std::lock_guard<std::mutex> lockerGurard(m_mutex);
        return m_queue.size();
    }

    void UnblockOne()
    {
        m_unblock = true;
        std::unique_lock<std::mutex> locker(m_mutex);
        locker.unlock();
        m_cond.notify_one();
    }
private:
    UnblockQueue(const UnblockQueue<T>& queue);
    UnblockQueue& operator= (const UnblockQueue<T>& queue);

private:
    std::queue<T> m_queue;
    std::mutex m_mutex;
    std::condition_variable m_cond;
    bool m_unblock;
};

Cutomer类

comtomer.h

#pragma once
#include <QThread>
#include <QString>
#include "UnblockQueue.h"
class Customer:public QThread
{
public:
    Customer(UnblockQueue<QString>* dataQueue);
    ~Customer();
    void Stop();
    virtual void run();
private:
    UnblockQueue<QString>* m_queue;
    bool m_stop;
};

comtomer.cpp

#include "Customer.h"
#include <QDebug>
Customer::Customer(UnblockQueue<QString>* dataQueue)
    :m_stop(true), m_queue(nullptr)
{
    m_queue = dataQueue;
}

Customer::~Customer()
{
}
void Customer::Stop()
{
    m_stop = true;
    m_queue->UnblockOne();
}

void Customer::run()
{
   m_stop = false;
   while (!m_stop)
   {
      QString item = m_queue->Pop();
      qDebug() << item;
   }
   qDebug() << "customer out";
}

Productor类

Productor.h

#include "UnblockQueue.h"
class Productor : public QThread
{
public:
    Productor(QString productName,UnblockQueue<QString>* queue);
    ~Productor();
protected:
    virtual void run();
private:
    bool m_stop;
    UnblockQueue<QString>* m_queue;
    QString m_productName;
};

Productor.cpp

#include "Productor.h"
#include <random>
Productor::Productor(QString productName, UnblockQueue<QString>* queue)
    :m_stop(true), m_queue(nullptr)
{
    m_productName = productName;
    m_queue = queue;
}

Productor::~Productor()
{
}



void Productor::run()
{
    int count = 0;
    while (count < 10)
    {
        std::random_device rd;
        QString item = QString("%1--%2").arg(m_productName).arg(QString::number(rd()));
        m_queue->Push(item);
        count++;
    }
}

main.cpp

#include <QtCore/QCoreApplication>
#include "Productor.h"
#include "Customer.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    UnblockQueue<QString>* myqueue = new UnblockQueue<QString>();
    Customer customer(myqueue);
    Productor producter1("product1", myqueue);
    Productor producter2("product2", myqueue);
    customer.start();
    producter1.start();
    producter2.start();

    QThread::msleep(3000);

    customer.Stop();
    customer.wait(2000);
    if (customer.isRunning())
    {
        customer.terminate();
    }
    customer.wait();
    return a.exec();
}

这里写图片描述

YOLOv8作物病害检测实战源码 这是一套基于YOLOv8n的农田病虫害目标检测系统,对叶片照片做目标检测,识别健康叶片、褐斑病、白粉病、锈病四类,并给出对应防治建议。全流程纯CPU可跑,配套交付完整Python源码、9章实战教程(md/html/pdf三种格式)、100张自造样本及YOLO标签、训练曲线与混淆矩阵截图、Tkinter界面和答辩PPT。 系统围绕五项功能展开:同一套推理逻辑覆盖图像、视频、摄像头三种来源;图形界面选文件即检测,画面叠彩色框标注病名与置信度,右侧面板同步给出症状与防治措施;检测记录自动写入CSV,统计页一键生成四类病害占比饼图;训练结束自动产出损失与精度曲线;内置防治建议文案库,检测命中即回填面板。 选型用YOLOv8n nano档,参数量约320万、权重约6.2MB,CPU单帧几十毫秒,小样本训练5到8分钟完成。数据由data_gen.py程序化绘制100张叶片图,固定随机种子,重跑分布一致,不依赖公开数据集。依赖全部锁版本,教程第7章整理了19条真实报错及排查方法,第8章给出换模型档、换PlantVillage数据集的迁移路径。 适合做计算机视觉方向课程设计或毕业设计的学生,也适合智慧农业方向想了解检测模型如何落进业务面板的学习者。不需要GPU,不需要系统学过目标检测,教程第3章会按需补齐原理。 使用时先pip install -r requirements.txt装好依赖,download_data.py下载预训练权重,data_gen.py生成样本后train.py训练,完成后用main.py infer批量检测或main.py gui启动界面。 立即下载

相关推荐

数据挖掘实战:决策树 + 聚类 + 关联规则,零 Key 离线可跑(Python 源码)

数据挖掘实战包。用 Python 标准库实现 CART 风格决策树、K-Means 聚类与 Apriori 关联规则,在虚构「星河便利店」会员表和购物篮上跑通分类、分群与购物篮分析,并给出准确率、轮廓系数、支持度/置信度/提升度。零第三方依赖、零 API Key 即可离线跑通。含 4 个样例、离线冒烟、中文 README(含「使用方法」)。均为作者原创可运行源码。MIT。作者 blog.youkuaiyun.com/mtl1994

python 线程锁

文章目录1. 什么是线程锁2. 为什么要使用线程锁3. 应用场景4. 代码实现5. 线程锁的缺点6. 参考文献 1. 什么是线程锁 2. 为什么要使用线程锁 相信大家都知道,在python中多线程是共享全局变量的,多进程是各自都拥有一份属于自己的所有变量。既然多个线程使用同样的一些全局变量,会导致全局变量的不同步。例如:面试题点击跳转,该面试题要求使用两个线程,但是要我们控制两个线程的输出是有序的...

besmarterbestronger的博客 2356

科技中介服务机构在技术供需对接中如何实现服务流程的自动化与标准化?.docx

科技中介服务机构在技术供需对接中如何实现服务流程的自动化与标准化?

线程和进程状态

进程状态和线程状态原理一样,只是进程状态被分的很详细,所遇情况也不同,则细节上分有不同状态 进程状态: 进  程:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 进程状态:一个进程的生命周期可以划分为一组状态,这些状态刻画了整个进程。进程状态即体现一个进程的生命状态。 进程状态:一般来说,进程有三个状态,即就绪状态,运行状态,阻塞...

weixin_30399155的博客 667

产业园区如何高效对接企业技术需求与高校科研成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

国央企创新负责人如何快速掌握本地科技资源分布与匹配情况?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

经典例题:生产者/消费者

线程通信的应用:经典例题:生产者/消费者 package com.day0207_2; /** * 线程通信的应用:经典例题:生产者/消费者 * * 生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品, * 店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员 * 会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;如果店中没有产品 * 了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。

小心星的博客 913

国央企创新负责人如何实现科技成果的精准识别与高效筛选?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

java blockqueue_一文秒懂 Java BlockingQueue

本文中,我们将介绍一个 java.util.concurrent 包提供的用于解决并发生产者 - 消费者问题的最有用的类 - BlockQueue。我们将介绍BlockingQueue 接口的 API 以及如何使用该接口的方法使编写并发程序更容易。在本文的后面,我们将展示一个具有多个生产者线程和多个消费者线程的简单程序的示例。BlockingQueue 的队列类型java.util.concurr...

weixin_39743603的博客 465

高校技术转移办公室人员如何系统化管理科技成果信息?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

科技中介服务机构如何构建标准化、模块化的智能服务工具?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

python之Thread和multiprocessing

下面的每个例子虽然都只给了代码,但是代码我都做了非常非常详细的注释,相信我们都能从其中得到知识的提升!~ 1.multithread_面向过程 import threading import time import os # a program to simulate selling tickets in multi-thread way # u may realize that this i

越努力越幸运 4912

fab-pm-optimizer-python-entry-py39-20261021-v1-1-0

fab-pm-optimizer-python-entry-py39-20261021-v1-1-0

blocked Queue

有几种blocked Queue 系统开发中,经常会用到 阻塞型的容器,适合于实现“消费者生产者”模式转发类图介绍核心接口放入数据 offer(anObject): 非阻塞, 表示如果可能的话,如可容纳,return true; offer(E o, long timeout, TimeUnit unit), 阻塞+超时; put(anObject): 一直阻塞; 获取数据 poll(time):

imduan的博客 1397

PSIM-三相维也纳VIENNA整流器电压电流双闭环+中点电位平衡SVPWM控制仿真

内容概要:本文档详细介绍了一种基于PSIM软件实现的三相维也纳(VIENNA)整流器仿真模型,重点实现了电压电流双闭环控制与中点电位平衡的SVPWM调制策略。该仿真系统通过精确的控制算法有效提升了整流器的功率因数,降低了输入电流谐波含量,并解决了三电平拓扑中常见的直流侧中点电位偏移问题,具有较高的工程实用价值,适用于高效率、高功率密度的电力电子系统设计与科研验证。文档还整合了丰富的配套资源,涵盖多种电力电子变换器拓扑结构、先进控制算法及典型应用场景,形成了系统化的技术资料体系,有助于深入理解现代整流技术的核心原理与发展动态。; 适合人群:面向从事电力电子、电气工程、新能源变换系统等领域的科研人员、高校研究生以及具备一定仿真基础的工程技术人员。; 使用场景及目标:①深入研究三相VIENNA整流器的工作机理与控制特性;②掌握电压外环、电流内环双闭环控制结构的设计方法;③理解并实现SVPWM调制技术与中点电位平衡控制策略的协同作用;④开展相关控制算法的仿真验证、性能优化与实验对比,为高性能整流装置的研发提供理论支撑和技术原型。; 阅读建议:建议结合文中列出的其他仿真案例(如PWM整流器、LLC谐振变换器、DAB变换器等)进行横向对比学习,充分利用所提供的PSIM、MATLAB/Simulink等多平台仿真资源,重点关注控制逻辑与主电路的耦合关系,通过参数调试与波形分析深化对系统动态响应和稳态性能的理解,强化“理论—建模—仿真—优化”的闭环研究能力。

产业园区运营负责人如何利用数智工具提升园区企业的技术对接效率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

ICD10 openGauss版

ICD10 openGauss版

第7篇-SAP MM模块-JIT应用实战解析,从计划协议到JIT供应的关键配置与流程

本文深入解析SAP MM模块中的JIT(Just In Time)供应模式,从计划协议到JIT供应的关键配置与流程。通过动态计划行管理、需求聚合与分解等核心功能,实现精确数量、时间和地点的物料供应。文章详细介绍了主数据准备、计划协议配置、MRP参数精调及EDI集成方案,并提供了实施中的典型问题与解决方案,助力企业优化供应链管理。

weixin_30363509的博客 948
上一篇: 文本框
下一篇: VS 调试第三方库源码
writeeee
博客等级 码龄18年 35粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值