C++线程任务队列模型

功能描述

实现一个任务队列,用于任务的执行

任务队列
  • 任务队列可以添加、删除任务,实现对任务的管理
  • 添加任务后,任务队列可以开始执行
  • 任务队列执行任务方式为串行执行
任务
  • 任务执行需要持续一段10s内随机的时间,执行过程通过sleep函数模拟
  • 任务有三种状态,未执行,执行中,已结束
  • 任务执行中,每隔1s输出一次当前进度
功能测试

在任务队列中添加2个任务并执行,所有任务完成后退出程序

其中任务执行时间为随机值,此处任务1运行3s,任务2运行2s,仅作示例

  • 串行队列执行输入示例如下

    添加任务 1

    添加任务 2

    串行任务队列开始执行,共有2个任务

    任务1开始执行,将运行3秒

    任务1已完成33%

    任务1已完成66%

    任务1已完成100%

    任务1已结束

    任务2开始执行,将运行2秒

    任务2已完成50%

    任务2已完成100%

    任务2已结束

    任务队列结束执行

代码如下:

#include <iostream>
#include <vector>
#include <thread>
#include <chrono>
#include <mutex>

class Task {
public:
    enum class Status { NotStarted, InProgress, Completed };

    Task(int id) : id_(id), status_(Status::NotStarted) {}

    void execute() {
        status_ = Status::InProgress;
        int duration = rand() % 10 + 1; // Random duration between 1 and 10 seconds
        for (int i = 1; i <= duration; ++i) {
            std::this_thread::sleep_for(std::chrono::seconds(1));
            //std::lock_guard<std::mutex> lock(mutex_);
            std::cout << "任务" << id_ << "已完成" << i * 100 / duration << "%\n";
        }
        status_ = Status::Completed;
        std::cout << "任务" << id_ << "已结束\n";
    }

    Status getStatus() const { return status_; }

private:
    int id_;
    Status status_;
    //mutable std::mutex mutex_;
};

class TaskQueue {
public:
    void addTask(Task task) {
        tasks_.push_back(task);
    }

    void startExecution() {
        std::cout << "串行任务队列开始执行,共有" << tasks_.size() << "个任务\n";
        for (auto& task : tasks_) {
            task.execute();
        }
        std::cout << "任务队列结束执行\n";
    }

private:
    std::vector<Task> tasks_;
};

int main() {
    TaskQueue taskQueue;
    taskQueue.addTask(Task(1));
    taskQueue.addTask(Task(2));
    taskQueue.startExecution();
    return 0;
}

运行结果如下:
在这里插入图片描述
这个程序实现了一个简单的任务队列,其中任务类表示一个可执行的任务,具有状态(未开始、进行中、已完成)。任务队列类负责管理任务的添加和执行,执行方式为串行执行。每个任务的执行时间是随机的,并且在执行过程中会输出当前的进度信息。

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

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

相关文章

每天五分钟深度学习:如何使用计算图来反向计算参数的导数?

本文重点 在上一个课程中&#xff0c;我们使用一个例子来计算函数J&#xff0c;也就相当于前向传播的过程&#xff0c;本节课程我们将学习如何使用计算图计算函数J的导数。相当于反向传播的过程。 计算J对v的导数&#xff0c;dJ/dv3 计算J对a的导数&#xff0c;dJ/da&#xf…

JVM学习-字节码指令集(一)

概述 Java字节码对于虚拟机&#xff0c;好像汇编语言对于计算机&#xff0c;属于基本执行指令Java虚拟机的指令由一个字节长度的&#xff0c;代表某种特定操作含义 的数字(称为操作码Opcode)以及跟随其后的零至多个代表此操作所需参数(操作数&#xff0c;Operands)而构成&…

如何实时掌握手机号状态的API利器分析

在移动互联网的时代&#xff0c;手机号码不仅是通信的连接点&#xff0c;也是用户身份的关键识别。手机状态查询API 通过提供实时的手机号码状态查询服务&#xff0c;协助企业和组织更有效地管理用户信息&#xff0c;提升服务流程。 手机状态查询API 通过与电信运营商的数据库进…

UE5 使用外置摄像头进行拍照并保存到本地

连接外置摄像头功能&#xff1a;https://docs.unrealengine.com/4.27/zh-CN/WorkingWithMedia/IntegratingMedia/MediaFramework/HowTo/UsingWebCams/ 核心功能&#xff1a;UE4 相机拍照功能&#xff08;图片保存&#xff09;_ue 移动端保存图片-CSDN博客 思路是&#xff1a; …

《python编程从入门到实践》day41

# 昨日知识点回顾 用户注销、注册&#xff0c;限制访问&#xff0c;新主题关联到当前用户 # 今日知识点学习 第20章 设置应用程序的样式并部署 20.1 设置项目“学习笔记”的样式 20.1.1 应用程序django-bootstrap4 # settings.py ---snip--- INSTALLED_APPS [# 我的应用程序…

免费,Python蓝桥杯等级考试真题--第14级(含答案解析和代码)

Python蓝桥杯等级考试真题–第14级 一、 选择题 答案&#xff1a;B 解析&#xff1a;键为‘B’对应的值为602&#xff0c;故答案为B。 答案&#xff1a;A 解析&#xff1a;字典的符合为花括号&#xff0c;先键后值&#xff0c;故答案为A。 答案&#xff1a;C 解析&#xff1a…

磁盘管理后续——盘符漂移问题解决

之前格式化磁盘安装了文件系统&#xff0c;且对磁盘做了相应的挂载&#xff0c;但是服务器重启后挂载信息可能有问题&#xff0c;或者出现盘符漂移、盘符变化、盘符错乱等故障&#xff0c;具体是dev/sda, sdb, sdc 等等在某些情况下会混乱掉 比如sda变成了sdb或者sdc变成了sdb等…

100个 Unity小游戏系列七 -Unity 抽奖游戏专题五 刮刮乐游戏

一、演示效果 二、知识点讲解 2.1 布局 void CreateItems(){var rewardLists LuckyManager.Instance.CalculateRewardId(rewardDatas, Random.Range(4, 5));reward_data_list reward_data_list ?? new List<RewardData>();reward_data_list.Clear();for (int i 0; …

ADS基础教程17 - 创建含参子图

设计加密保护IP 一、引言二、参数设计 一、引言 将一个子图内部元器件的参数设置成可以在外部进行修改的参数&#xff0c;能够使得封装的子图更加灵活和通用。 二、参数设计 (1)打开一个子图&#xff0c;在菜单栏中选择File–>Design Parameters… (2)弹出的对话框中&am…

国产PS插件新选择;StartAI平替中的佼佼者!

前言 在设计的世界里&#xff0c;每一个细节都至关重要。设计师们常常面临时间紧迫、创意受限、工具复杂等挑战。Photoshop虽强大&#xff0c;但繁琐的操作和高昂的成本往往令人望而却步。今天我就为大家介绍一款PSAI插件——StartAI&#xff0c;一款专为Photoshop设计的国产A…

Django配置

后端开发&#xff1a; python 解释器、 pycharm 社区版、 navicate 、 mysql(phpstudy) 前段开发&#xff1a; vs code 、 google 浏览器 django 项目配置 配置项目启动方式 创建模型 创建一个应用 在应用中创建模型类 根据模型类生成数据表 创建应用 创建模型类 …

ADS基础教程16 - 存档和导入(workspace、cell、view)

设计加密保护IP 一、引言二、workspace归档二、Cell归档三、View归档四、导入归档文件 一、引言 介绍如何ADS中如何对workspace、cell和view进行存档&#xff0c;以及如何将存档文件导入到工程中。 二、workspace归档 (1)在菜单栏中&#xff0c;选择File–>Archive Works…

LeetCode---栈与队列

232. 用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int pee…

利用AI技术实现Medium文章的高效中文翻译

在深入学习大模型的过程中&#xff0c;我们常常需要查阅Medium上的技术文章。Medium作为一个流行的内容发布平台&#xff0c;汇集了大量高质量的技术和科学文章&#xff0c;对于希望紧跟技术前沿的学习者来说&#xff0c;是一个宝贵的知识库。然而&#xff0c;这些文章大多为英…

STL库--string

目录 string的定义 string中内存的访问 string常用函数实例解析 string的定义 定义string的方式跟基本类型相同&#xff0c;只需要在string后跟上变量名即可&#xff1a; string str; 如果要初始化&#xff0c;可以直接给string类型的变量进行赋值&#xff1a; string s…

据库管理-第196期 实战RDMA(20240528)

数据库管理196期 2024-05-28 数据库管理-第196期 实战RDMA&#xff08;20240528&#xff09;1 环境2 操作系统配置3 配置NVMe over RDMA4 挂载磁盘处理并挂载磁盘&#xff1a; 5 RDMA性能测试6 iSCSI部署7 iSCSI性能测试8 性能对比总结 数据库管理-第196期 实战RDMA&#xff08…

大数据Hadoop之-工具HIVE(一)

大数据Hadoop之——数据仓库Hive HIVE介绍Hive是基于Hadoop的一个数据仓库(Data Aarehouse,简称数仓、DW),可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。是用于存储、分析、报告的数据系统。 在Hadoop生态系统中,HDFS用于存储数据,Yarn用于资源管理…

设计模式:装饰模式(Decorator)

设计模式&#xff1a;装饰模式&#xff08;Decorator&#xff09; 设计模式&#xff1a;装饰模式&#xff08;Decorator&#xff09;模式动机模式定义模式结构时序图模式实现在单线程环境下的测试在多线程环境下的测试模式分析优缺点适用场景应用场景应用实例模式扩展参考 设计…

shell中编写备份数据库脚本(使用mysqldump工具)

mysqldump备份 目录 mysqldump备份 分库备份 分表备份 利用自带工具mysqldump 实现数据库分库分表备份。 要想知道需要备份哪些数据库&#xff0c;就得先列出来 mysql -uroot -pOpenlab123! -N -e show databases | egrep -on_schema|mysql|performance_schema|sys" …

【Mybatis】映射文件中获取参数的类型是集合或数组处理

基本数据类型的参数或者对象作为参数的情况&#xff0c;在Mybatis还有一些特殊处理的参数类型要特别注意&#xff1a;如果参数类型是集合Collection&#xff08;List&#xff0c;Set&#xff09;或者是数组&#xff0c;Mybatis也会把这些类型的参数封装在一个Map对象中传递到xm…