欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

令牌桶算法的 C++ 实现

最编程 2024-03-07 13:08:26
...

以下是一个简单的 C++ 实现代码:

#include <iostream>
#include <chrono>
#include <thread>

class TokenBucket {
 public:
  TokenBucket(int rate, int capacity)
      : rate_(rate),
        capacity_(capacity),
        tokens_(0),
        last_time_(std::chrono::system_clock::now()) {}

  bool get_token() {
    std::chrono::time_point<std::chrono::system_clock> now =
        std::chrono::system_clock::now();
    std::chrono::duration<double> elapsed_seconds = now - last_time_;
    last_time_ = now;

    tokens_ += elapsed_seconds.count() * rate_;
    if (tokens_ > capacity_) {
      tokens_ = capacity_;
    }

    if (tokens_ < 1.0) {
      return false;
    } else {
      tokens_ -= 1.0;
      return true;
    }
  }

 private:
  double rate_;
  double capacity_;
  double tokens_;
  std::chrono::time_point<std::chrono::system_clock> last_time_;
};

int main() {
  TokenBucket tb(2, 10);  // 每秒生成2个令牌,容量为10个令牌
  while (true) {
    if (tb.get_token()) {
      std::cout << "Got token" << std::endl;
    } else {
      std::cout << "not enough tokens" << std::endl;
    }
    std::this_thread::sleep_for(std::chrono::seconds(1));
  }

  return 0;
}

这个代码实现了一个可以生成令牌的令牌桶,每秒生成指定的令牌数,并且有一个容量限制。如果桶中的令牌数不够,则调用 get_token 函数返回 false;如果令牌数足够,则从桶中扣除一个令牌并返回 true