C++ 缓存再排序,解决多线程处理后的乱序问题,不知道思路对不对[挠下巴]

这篇具有很好参考价值的文章主要介绍了C++ 缓存再排序,解决多线程处理后的乱序问题,不知道思路对不对[挠下巴]。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用map默认会根据key排序的原理作缓存,队列满了依次推出,抛弃掉过时的数据文章来源地址https://www.toymoban.com/news/detail-628268.html

#include <functional>
#include <iostream>
#include <map>
#include <random>
#include <set>
#include <tuple>
#include <vector>

template <typename V> class SortQueue {
private:
  std::function<void(const int, V &)> callback;
  std::map<int, V> m;
  int max_size;
  int last;

public:
  SortQueue(int max) : max_size(max), last(0) {}
  ~SortQueue() {}

  void setCallback(std::function<void(const int, V &)> callback) {
    this->callback = callback;
  }

  void push(int k, V &v) {
    if (k < last)
      return;
    m.emplace(std::make_pair(k, std::move(v)));
    if (m.size() > max_size) {
      auto it = m.begin();
      if (callback) {
        callback(it->first, it->second);
        last = it->first;
      }
      m.erase(it);
    }
  }
};

std::vector<int> r(int start, int end, int size) {
  std::set<int> generated_nums; // 存储已生成的随机数
  std::vector<int> nums;
  std::random_device rd;
  std::mt19937 gen(rd());
  std::uniform_int_distribution<int> dis(start, end);

  while (generated_nums.size() < size) { // 生成10个不重复的随机数
    int random_num = dis(gen);

    if (generated_nums.find(random_num) == generated_nums.end()) {
      generated_nums.insert(random_num);
      nums.push_back(random_num);
    }
  }

  return std::move(nums);
}

void p(std::vector<int> &arr) {
  std::string result;

  for (int i = 0; i < arr.size(); ++i) {
    result += std::to_string(arr[i]) + " ";

    if ((i + 1) % 10 == 0) {
      result += "\n";
    }
  }

  std::cout << "拼接后的字符串: \n" << result << std::endl;
}

int main(int argc, char *argv[]) {
  std::vector<int> nums;

  int start = 1;
  int end = 0;
  int size = 10;
  for (int i = 0; i < 5; i++) {
    start = i * size + 1;
    end = i * size + 10;
    std::vector<int> temp = r(start, end, size);
    nums.insert(nums.end(), temp.begin(), temp.end());
  }
  // std::vector<int> nums = r(1, 50, 50);
  p(nums);

  SortQueue<int> sq(5);
  sq.setCallback(
      [](const int k, int &v) { std::cout << "K: " << k << std::endl; });
  for (int num : nums) {
    sq.push(num, num);
  }
  return 0;
}

到了这里,关于C++ 缓存再排序,解决多线程处理后的乱序问题,不知道思路对不对[挠下巴]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flink之数据乱序处理

    在了解为什么会乱序之前我们先来看一下在Flink中的时间语序。 1.1  Flink Time  时间语义 Event Time:事件产生的时间,它通常由事件中的时间戳描述。 Ingestion Time:事件进入Flink的时间。 Processing Time:事件被处理时当前系统的时间。 这三种时间的对应关系如下图所示: 1.2  数

    2024年02月07日
    浏览(28)
  • C++类设计:一个比较复杂的日志类 支持多线程、文件切换、信息缓存(源码)

    初级代码游戏的专栏介绍与文章目录-CSDN博客 github位置:codetoys/ctfc.git src/env/myLog.h和.cpp           这个类功能细节比较多,因为是长期使用的版本,累积了各种功能。之前介绍的两个是我的测试代码用的版本,非常简单,那两个在这里: C++类设计:设计一个日志类(源码

    2024年04月10日
    浏览(29)
  • 【天衍系列 03】深入理解Flink的Watermark:实时流处理的时间概念与乱序处理

    Watermark 是用于处理事件时间的一种机制,用于表示事件时间流的进展。在流处理中,由于事件到达的顺序和延迟,系统需要一种机制来衡量事件时间的进展,以便正确触发窗口操作等。Watermark 就是用来标记事件时间的进展情况的一种特殊数据元素。 Watermark 的生成方式通常是

    2024年02月20日
    浏览(34)
  • kafka乱序消费可能的原因和解决方案

    Kafka乱序消费可能的原因有以下几个: 分区顺序:Kafka中的消息按照分区进行存储和分发,每个分区内的消息是有序的,但不同分区之间的消息顺序是无法保证的。如果消费者在多个分区上进行并行消费,并且不处理消息的顺序,那么消费顺序可能会混乱。 消费者并发度:当

    2024年01月25日
    浏览(26)
  • Video标签添加跨域头信息后的缓存问题

    第一步的页面,这个页面有两个 video标签,他们的 src一样 为第video标签添加参数 crossorigin=“anonymous” ,那么会报错。“xxxx” has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. 这里的video.mp4的静态文件服务器,服务端的代码用 express写的,

    2024年02月16日
    浏览(30)
  • Java ORM Bee 2.1.7 解决缓存雪崩问题,sql 格式化,配置 Sharding 执行线程池大小

    Bee, 开发 JavaWeb 数据库应用首选。既想得到 NoSQL 的性能,又想拥有关系型数据库事务的能力,用 ORM Bee, 即可轻松解决. Java ORM Bee 不但支持 JDBC 类型的数据库,还支持 Mongodb, 也支持 Android, 鸿蒙. Hibernate/MyBatis+ plus +Sharding JDBC + Jpa+ Spring data+ GraphQL+ App ORM (Android, 鸿蒙)= Bee V2

    2024年02月13日
    浏览(34)
  • 解决windows由于分辨率调整导致的桌面图标位置乱序

    https://www.zhihu.com/question/328534753 https://baijiahao.baidu.com/s?id=1724804313296173730wfr=spiderfor=pc windows电脑由于连接(扩展)外接显示器、全屏游戏、远程桌面连接等会导致分辨率调整,从而导致桌面上排列好的图片会变乱,这里有两种方式解决: 通过修改注册表项来解决 通过桌面图标

    2024年01月23日
    浏览(67)
  • UE5中双pass解决半透明材质乱序问题

    透明度材质乱序问题一直是半透明效果时遇到的比较多的问题,用多pass方案只能说一定程度上解决,当遇到多半透明物体穿插等情况时,仍然不能完美解决。 双pass方案Unity用的比较多,因为Unity支持多个pass绘制。在UE中我们可以以复制多个物体赋予不同材质球的方式模拟多

    2024年02月07日
    浏览(34)
  • 一道神奇的面试题---无序数组排序后的最大相邻差

    一:概述 这个算法的面试题目是:有一个无序整型数组,如何求出该数组排序后的任意两个相邻元素的最大差值?要求时间和空间复杂度尽可能低。     二:具体说明 1第一种解法(初步解法) 这个解法的大致思路:使用任意一种时间复杂度为O(nlogn)的排序算法(如快速排序)给

    2024年04月28日
    浏览(30)
  • 解决Map序列化成JSON字符串传给前端后属性乱序问题

    map序列化成json对象传递给前端时,map中属性的顺序会按首字母重新排序 json对象中的属性没有顺序而言,一次序列化、反序列化就会乱。 试过把map转成了JSON字符串,传给前端,还是不行 想到数组可以保证顺序,可以把后端的map转成List数组,这样序列化成json不会影响顺序。

    2024年02月02日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包