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已结束

    任务队列结束执行

代码如下:

cpp 复制代码
#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;
}

运行结果如下:

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

相关推荐
闻缺陷则喜何志丹几秒前
【状态压缩动态规划】P8733 [蓝桥杯 2020 国 C] 状态压缩动态规划|普及+
c++·算法·蓝桥杯·动态规划·洛谷
alanesnape14 分钟前
Valgrind 测试详解--检测内存泄漏的好工具
c语言·c++·算法
近津薪荼1 小时前
优选算法——前缀和(6):和可被 K 整除的子数组
c++·算法
白太岁1 小时前
通信:(2) TCP/UDP、流量/拥塞控制、ARP 与 Socket 应用
网络·c++·tcp/ip·udp
草莓熊Lotso1 小时前
Linux 磁盘基础:从物理结构到 CHS/LBA 寻址,吃透数据存储底层逻辑
linux·运维·服务器·c++·人工智能
燃于AC之乐1 小时前
深入解剖STL map/multimap:接口使用与核心特性详解
开发语言·c++·stl·面试题·map·multimap
草莓熊Lotso1 小时前
Qt 核心事件系统全攻略:鼠标 / 键盘 / 定时器 / 窗口 + 事件分发与过滤
运维·开发语言·c++·人工智能·qt·ui·计算机外设
阿kun要赚马内3 小时前
C++中的Windows API双缓冲技术
c++
WBluuue10 小时前
Codeforces 1078 Div2(ABCDEF1)
c++·算法
学无止境_永不停歇10 小时前
十、C++多态
开发语言·c++