首页 > 编程语言 >限流器(流控)+ 线程 C++实现

限流器(流控)+ 线程 C++实现

时间:2024-03-21 21:34:42浏览次数:34  
标签:std RateLimiter 并发 C++ concurrent 限流 线程

在C++中,你可以使用互斥锁(mutex)和条件变量(condition variable)来实现一个简单的限流器(流控)以及线程。下面是一个简单的例子,它创建了一个限流器类,该类允许一定数量的线程同时访问某个资源。

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

class RateLimiter {
public:
    RateLimiter(int max_concurrent) : max_concurrent_(max_concurrent), current_concurrent_(0) {}

    void Enter() {
        std::unique_lock<std::mutex> lock(mutex_);
        // 等待,直到当前并发数小于最大并发数
        while (current_concurrent_ >= max_concurrent_) {
            cond_.wait(lock);
        }
        // 增加当前并发数
        ++current_concurrent_;
    }

    void Leave() {
        std::unique_lock<std::mutex> lock(mutex_);
        // 减少当前并发数
        --current_concurrent_;
        // 通知其他等待的线程
        cond_.notify_one();
    }

private:
    int max_concurrent_;
    int current_concurrent_;
    std::mutex mutex_;
    std::condition_variable cond_;
};

void Worker(RateLimiter& limiter, int id) {
    limiter.Enter();
    std::cout << "Thread " << id << " is working." << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟工作
    std::cout << "Thread " << id << " finished work." << std::endl;
    limiter.Leave();
}

int main() {
    RateLimiter limiter(3); // 设置最大并发数为3
    std::vector<std::thread> threads;

    for (int i = 0; i < 10; ++i) {
        threads.emplace_back(Worker, std::ref(limiter), i);
    }

    for (auto& thread : threads) {
        thread.join();
    }

    return 0;
}

这个例子中,RateLimiter类使用了一个互斥锁和一个条件变量来控制对资源的并发访问。Enter方法会阻塞线程,直到当前并发数小于最大并发数。一旦线程完成工作并调用Leave方法,它会减少当前并发数并通知其他等待的线程。

main函数中,我们创建了一个RateLimiter对象,最大并发数设置为3。然后我们创建了10个工作线程,每个线程都会尝试通过限流器来访问资源。由于限流器的限制,最多只有3个线程能够同时访问资源。其他线程将被阻塞,直到有线程完成工作并离开限流器。

标签:std,RateLimiter,并发,C++,concurrent,限流,线程
From: https://www.cnblogs.com/yubo-guan/p/18088283

相关文章

  • C++反射
    反射教程让程序看到自己的数据,并且能够对数据进行操作类型萃取对类型做萃取,有一组混合类型,将特定类型获取出来核心思路:使用模板来匹配查找例子:指针类型萃取解除一层指针,三级变二级,二级变一级template<typenameT>structremove_pointer{};template<typenameT>stru......
  • C++版数据结构与算法
    大家好,今天开始给大家每天带来C++版的数据结构与算法,后面也会包括C#的系统学习。这段代码是一个C++实现的排序算法集合。其中包括选择排序(selectionsort)、冒泡排序(bubblesort)、插入排序(insertionsort)和归并排序(mergesort)。算法后越往后越难,此次做这个系列博客,是想从......
  • QT增加线程函数步骤流程
    在使用线程的时候,不仅要关注线程开启的时机,同时还要关注线程安全退出,这样才能保证程序的健壮性,如果线程开启的较多,且开启关闭比较频繁,建议使用线程池来处理。开启线程有三种方式:第一种C++的开线程方式;第二种自定义一个继承自QObject的类,把要处理的事情放在这个类中实现,然后再ne......
  • 23种设计模式核心思想及代码实现(Java C++)
    目录代码OOP七大原则策略模式单例模式观察者模式装饰模式抽象工厂模式工厂模式简单工厂模式工厂模式抽象工厂模式三种工厂模式的区别简单工厂模式和策略模式的不同pipeline模式职责链模式代理模式静态代理动态代理......
  • 语音转文字——sherpa ncnn语音识别离线部署C++实现
    简介Sherpa是一个中文语音识别的项目,使用了PyTorch进行语音识别模型的训练,然后训练好的模型导出成torchscript格式,以便在C++环境中进行推理。尽管PyTorch在CPU和GPU上有良好的支持,但它可能对资源的要求较高,不太适合嵌入式环境或要求轻量级依赖的场景。考虑到模......
  • C++ this指针
    1. this指针的用处一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时......
  • 复试C++16真题_程序设计1_输出句子中每个单词长度
    输入一行文本,按照相应格式输出每个单词的长度#include<iostream>usingnamespacestd;#include<string>#include<vector>#include<iomanip>intmain(){stringsen="qweasdaxszfsfsddwfas";//getline(cin,sen);如果要把输入的空格的记录......
  • 数据清洗使用Parallel 多线程
    一.概述在开发数据清洗时,ES数据集有600w条,每一条的子对象又有几十条,需要拿到子对象去重后的集合,使用分批提取ES数据,共535批。开始使用List来操作,关键代码如下:varspecListAll=newList<SpecInfo>();for(inti=0;i<batchCount;i++)......
  • C++的内存管理
    1.C/C++内存分布我们可以先来了解一下具体的内存区域分布图,通过一个代码 那么我们想为什么要划分这些区域?为了方便管理因为我们在程序中有不同类型的数据(静态,局部,全局等)比如生命周期的不同,放到不同的区域进行管理哪个是我们重点关注的?堆区。因为其他区域不用管释......
  • 多线程并发聊天室简单实现代码详解 -- 涉及网络编程,多线程和线程同步的知识
            本项目主要完成多线程并发聊天室的基础功能,即多个客户端之间通过服务器可以实现群发消息,重点在于学习网络编程,多线程和线程同步的基础知识(基于Linux)。    下面我会详解每一部分的代码。1.主线程        1.1首先由于是自己在电脑里面测试,......