circular-buffer 相关问题

循环缓冲区是一种数据结构,它使用单个固定大小的缓冲区,就好像它是端到端连接一样。这种结构很容易缓冲数据流。

ESP32 中的 Byte Buffer Ring Buffer 类型

这是我第一次尝试使用环形缓冲区。在我的项目中,我通过 loRa 模块(特别是 Reyax RYLR998)接收数据,并将收到的每条消息推送到环形缓冲区。 我定义了一个结构体...

回答 1 投票 0

当消费者在实时上下文中操作时,如何在共享内存中安全地实现环形缓冲区

我的情况是这样的:在 Linux 机器上,我有一个共享内存区域,其中包含音频样本的环形缓冲区。这个环形缓冲区的消费者是一个硬实时 Xenomai 音频回调,s...

回答 1 投票 0

Java 中线程安全的循环缓冲区

考虑一些并行运行的 Web 服务器实例。每个服务器都拥有对单个共享“状态守护者”的引用,其作用是保留来自所有服务器的最后 N 个请求。 例如(...

回答 9 投票 0

无锁圆形数组

我正在考虑实现一个无锁循环数组。一个问题是以无锁方式维护头指针和尾指针。我想到的代码是: int 循环增量AndGet(

回答 5 投票 0

java 8 - 循环缓冲区

Java 中循环缓冲区的最佳实现是什么?我读过其他问题,但它们已经过时了,并且引用了 CircularFifoBuffer,它不存在于 Apache Commons Collections 4 中。是...

回答 1 投票 0

如何在测试用例中等待所有 Disruptor 消息被消耗

我正在尝试对消耗来自 Disruptor 环形缓冲区的消息的应用程序进行单元测试。在测试中我想 配置扰乱器及其事件处理程序 将消息发布到环上

回答 1 投票 0

==284==错误:AddressSanitizer:堆栈缓冲区下溢

我正在编写一个更简单版本的 Boyer Moore 算法,我需要使用循环缓冲区,因为可能会有很大的输入。程序应写入符号的所有位置...

回答 1 投票 0

在具有中断的循环缓冲区中使用易失性

在实现循环缓冲区时,我正在努力正确使用 volatile 关键字。该缓冲区在 ISR 中写入并在主程序中读取。我正在运行裸机微控制器...

回答 1 投票 0

如何在C++中安全地覆盖完整circular_buffer中的数据

我目前正在尝试思考如何安全地处理循环缓冲区已满且生产者想要将数据插入其中的情况。 原因是我有一个经典的生产者-消费者……

回答 1 投票 0

如何加快 Java 客户端中环形缓冲区的数据导入速度?

我们有一个第三方应用程序以非常高的速度生成数据并将其存储在多个环形缓冲区(hazelcast 集群)中。 消费者应用程序(另一个第三方应用程序)使用这个 java

回答 1 投票 0

Gstreamer:如何直接从缓冲区列表创建视频 |在 Gstreamer 中创建循环缓冲区

我正在尝试在 C 中使用 gstreamer 创建一个循环缓冲区。目前源是我的 PC 网络摄像头“v4l2src”。 一旦缓冲区列表达到预定义的大小,我就会刷新列表中最旧的缓冲区,然后

回答 1 投票 0

Gstreamer:如何直接从缓冲区列表创建视频

我正在尝试在 C 中使用 gstreamer 创建一个循环缓冲区。目前源是我的 PC 网络摄像头“v4l2src”。 一旦缓冲区列表达到预定义的大小,我就会刷新列表中最旧的缓冲区,然后

回答 0 投票 0

如何在C中使用memcpy实现循环缓冲区

我是 C 语言的初学者,刚开始使用循环缓冲区。我已经实现了这段代码,需要调整队列和出队函数以使用 memcpy()。有谁知道

回答 0 投票 0

java中的线程安全随机访问循环数组?

我需要缓存并发系统的最新结果(例如10,000),并随机访问它们。由于大多数并发缓存都基于链接列表,所以我想知道是否存在线程安全...

回答 1 投票 0

循环缓冲区:选择包括环绕点的索引范围

我认为这个问题最好通过一个例子来理解。因此,我们开始:假设定义了以下内容:parameter number_of_points_before_point_of_interest = 4;逻辑[15:0] test_data = 16'...

回答 1 投票 0

Linux上环形缓冲区的内存镜像

我使用匿名mmap分配大量内存。我想使用虚拟内存镜像将其中的几个连续页面变成一个环形缓冲区。此示例在...

回答 1 投票 6

如何在没有分支的圆形缓冲区中从头到尾迭代

我有一个以下问题,尽管有很多方法都不能满足我的需要:有一个索引为size_t的循环缓冲区,而底层缓冲区可能是我想要的任何东西,我需要迭代...

回答 1 投票 0

如何使用Boost循环缓冲区头对C ++文件进行交叉编译?

我正在尝试将以下c ++代码从Windows交叉编译到arm-linux。为此,我将gcc arm-linux-gnueabihf工具链与基于eclipse的ARM-DS5一起使用。 #include

回答 1 投票 0

重排序缓冲区:指针值已满?

Tomasulo算法中用于无序执行和分支推测的重排序缓冲区有2个指针。头指针:指向最早的指令。这将是下一个...

回答 1 投票 0

创建一个简单的前向迭代器,该迭代器将自动包装在循环缓冲区的“末端”

尽管该类继承自不推荐使用的std :: iterator类:] template <typename T> class circvector: public std::vector<T> { public: T& operator[](size_t index_) { return *(this->data() + index_%this->size()); }; // modulo index_ by vector size when accessing with [] operator class iterator; // forward declaration iterator begin() { return circvector<T>::iterator(*this, 0); } iterator end() { return circvector<T>::iterator(*this, this->size()); } // will be same as begin() due to modulo in iterator constructor initializer list private: class iterator : public std::iterator<std::output_iterator_tag, T> { private: circvector<T>& container_; // NOTE: ORDER MATTERS! // dependency injection size_t index_{ 0 }; // NOTE: ORDER MATTERS! // state of iterator public: T& operator*() const { return container_[index_]; } // this uses the overloaded operator[] which includes modulo iterator& operator+(int N) { index_ = (index_ + N) % container_.size(); return *this; } // random increment by N iterator& operator++() { index_ = (index_ + 1) % container_.size(); return *this; } // increment with modulo iterator operator++(int) { return ++(*this); } // just calls prefix increment: operator++() bool operator!=(const iterator & right) const { return index_ != right.index_ % container_.size(); } bool operator==(const iterator & right) const { return index_ == right.index_ % container_.size(); } explicit iterator(circvector<T>& container, size_t index_ = 0) : container_(container), index_(index_ % container_.size()) {} // constructor }; }; 它是根据https://lorenzotoso.wordpress.com/2016/01/13/defining-a-custom-iterator-in-c/修改的 测试程序是: int main() { circvector<int> buffer; buffer.assign({ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }); auto start_offset{ 8 }; auto end_offset{ start_offset + 5 }; for (int i = 0; i < buffer.size(); i++) std::cout << buffer[i] << " "; std::cout << "\n"; std::for_each(buffer.begin() + start_offset, buffer.begin() + end_offset, [](auto& i) { i = 42; }); for (int i = 0; i < buffer.size(); i++) std::cout << buffer[i] << " "; } 创建输出: 0 1 2 3 4 5 6 7 8 9 42 42 42 3 4 5 6 7 42 42 当然,不再使用从begin()到end()的算法,因为begin()== end()。但是您可以使用算法(如所示的std :: for_each)对缓冲区的部分段进行操作,只要其长度比整个缓冲区的大小小1。

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.