标签: circular-buffer

创建通用循环缓冲区

鉴于希望从其内容中抽象出循环缓冲区的结构,并从以下代码段开始(由此维基百科条目提供):

typedef struct
{ 
    int value;
} ElemType;

typedef struct
{
    int         size;      /* total number of elements */
    int         start;     /* index of oldest element */
    int         count;     /* index at which to write new element  */
    ElemType   *elements;  /* vector of elements */
} CircularBuffer;

void cbInit(CircularBuffer *cb, int size) {
    cb->size  = size;
    cb->start = 0;
    cb->count = 0;
    cb->elements = (ElemType *)calloc(cb->size, sizeof(ElemType));
}
Run Code Online (Sandbox Code Playgroud)

如何抽象元素类型,以便在定义CircularBuffer的实例时指定它?我到目前为止的尝试如下:

CircularBuffer *cbInit(uint16 size, void *element)
{
    CircularBuffer *buffer;

    buffer …
Run Code Online (Sandbox Code Playgroud)

c circular-buffer

4
推荐指数
1
解决办法
2881
查看次数

MATLAB中的循环缓冲区,**无**复制旧数据

关于如何在MATLAB中创建循环缓冲区,这里有一些好的帖子(比如这篇).然而,通过查看它们,我不相信它们适合我的应用程序,因为我所寻求的是MATLAB中的循环缓冲解决方案,它不涉及任何旧数据的复制.

举一个简单的例子,我们说我一次处理50个样本,每次迭代读取10个样本.我将首先完成5次迭代,填充我的缓冲区,最后处理我的50个样本.所以我的缓冲区将是

[B1 B2 B3 B4 B5]
Run Code Online (Sandbox Code Playgroud)

,其中每个'B'是10个样本的块.

现在,我在接下来的10个样本中读到,称之为B6.我希望我的缓冲区现在看起来像:

[B2 B3 B4 B5 B6]
Run Code Online (Sandbox Code Playgroud)

问题就是这样 - 我不想每次都复制旧数据,B2,B3,B4,B5,因为它在时间上变得昂贵.(我有非常大的数据集).

我想知道是否有办法在不复制"旧"数据的情况下执行此操作.谢谢.

optimization matlab buffer circular-buffer processing-efficiency

4
推荐指数
1
解决办法
3457
查看次数

Disruptor - Ring Buffer

我正在调查LMAX Disruptor的源代码,我进入了RingBuffer抽象类.为什么正好有7个长场(p1 ... p7)RingBufferPad?这是实际代码:https: //github.com/LMAX-Exchange/disruptor/blob/master/src/main/java/com/lmax/disruptor/RingBuffer.java

abstract class RingBufferPad
{
    protected long p1, p2, p3, p4, p5, p6, p7;
}

abstract class RingBufferFields<E> extends RingBufferPad
{
....
Run Code Online (Sandbox Code Playgroud)

java circular-buffer data-structures disruptor-pattern

4
推荐指数
1
解决办法
342
查看次数

带两个索引的循环缓冲区

我想制作一个循环缓冲区,它有两个索引:

  • WriteIndex(由第一个线程控制)在缓冲区中写入新值
  • ReadIndex(由第二个线程控制)从缓冲区读取值并进行分析

那么,当两个索引处于相同位置时,如何暂停Thread.我的意思是,如果你没有写任何新数据,你就无法读取它,所以如果writeindex和readindex处于相同位置,你只需要编写新数据,而不是读取它.

如何阻止线程直到发生什么?

c# multithreading circular-buffer

4
推荐指数
1
解决办法
150
查看次数

C#中的CircularBuffer IDictionary?

我需要一个CircularBuffer IDictionary.任何人都可以指出我一个良好的开源实现.

所以IDictionary具有最大容量,比如说配置为100个项目,当添加项目101时,从字典中弹出/删除原始的第一个项目,从而确保项目计数永远不会超过100.

谢谢

c# buffer dictionary circular-buffer

3
推荐指数
2
解决办法
2165
查看次数

使用循环数组实现队列:哪种方法可以调整圆形数组的大小?

我正在使用一个循环数组实现一个队列,我有点陷入resize()方法实现(当数组已满).

enqueue()方法内部,我检查数组的大小是否等于它的长度,并获得它是否已满.现在,我没有抛出异常,而是试图调整数组的大小.

问题是,我有两个案例需要考虑

  1. 前面<=后面
  2. 后<前

将旧数组的元素复制到新的较大数组中的最佳方法是什么?

我认为它使用for循环,如:

newArray = new Array[oldArray.length*2];

if (front <= rear) {
    for (int i = front; i < rear; i++) {
        newArray[i] = oldArray[i];
    } 
} else {
    for (int i = front; i < newArray.length; i++) {
        newArray[i] = oldArray[i];
    }

    for (int j = rear; j < front; j++) {
        // i'm using the variable i, the order is maintained
        newArray[i] …
Run Code Online (Sandbox Code Playgroud)

java arrays queue resize circular-buffer

3
推荐指数
1
解决办法
5664
查看次数

向后滚动圆形阵列

我有一个数组,我想向后滚动它的位置.

我有一个布尔数组,我需要计算从给定的单元格向前和向后的真实数量.

我知道如果N是数组中元素的数量,我可以继续做i =(i + 1)%N.但是,如果我需要以相反的方式滚动它呢?

先感谢您.

java circular-buffer

3
推荐指数
2
解决办法
940
查看次数

为什么在使用共享内存的Producer-Consumer范例中,缓冲区中只允许使用BUFFER_SIZE-1项?

以下是摘自"操作系统概念"第7版高尔文,加涅第3章的硬拷贝本身:


以下变量驻留在生产者和使用者进程共享的内存区域中:

#define BUFFER_SIZE 10

typedef struct {
 . . .
} item;

item buffer[ BUFFER_SIZE ];
int in = 0;
int out = 0;
Run Code Online (Sandbox Code Playgroud)

共享缓冲器被实现为具有两个逻辑指针的圆形阵列: .The变量指向在缓冲器中的下一个自由位置; out指向缓冲区中的第一个完整位置.当in==out;缓冲区已满时,缓冲区为空((in+1)%BUFFER_SIZE)==out.

该方案允许BUFFER_SIZE-1缓冲区中的大多数项目同时存在.


我用粗体突出了我的困惑.这是该章的在线幻灯片的链接(但它编辑了本书的几行).转到"使用共享内存的生产者 - 消费者示例"部分

http://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/3_Processes.html

为什么BUFFER_SIZE-1缓冲区中有项目?如果我们从开始buffer[0]buffer[BUFFERSIZE-1],是不是等于BUFFER_SIZE项目数?作者是否意味着说缓冲区的索引不能超过BUFFER_SIZE-1?但是,他已经明确写出了同时不能超过的项目BUFFER_SIZE-1.请解释整件事.

c operating-system producer-consumer circular-buffer

3
推荐指数
1
解决办法
4842
查看次数

Java Collection用于特殊滚动,循环队列

我正在寻找类似的东西ConcurrentLinkedQueue,但有以下行为:

  • 当我peek()/ poll()队列中,它检索HEAD,也不会删除它,并且随后前进HEAD一个节点向TAIL
  • 当HEAD == TAIL时,下次I peek()/时poll(),HEAD重置为其原始节点(因此为"循环"行为)

所以,如果我像这样创建队列:

MysteryQueue<String> queue = new MysteryQueue<String>();
queue.add("A"); // The "original" HEAD
queue.add("B");
queue.add("C");
queue.add("D"); // TAIL

String str1 = queue.peek(); // Should be "A"
String str2 = queue.peek(); // Should be "B"
String str3 = queue.peek(); // Should be "C"
String str4 = queue.peek(); // Should be "D"
String str5 = queue.peek(); // Should be "A" again
Run Code Online (Sandbox Code Playgroud)

以这种方式,我可以整天偷看/轮询,队列将一遍又一遍地滚动我的队列.

JRE是否附带这样的东西?如果没有,可能是Apache Commons Collections或其他第三方库中的某些东西?提前致谢!

java queue collections circular-buffer apache-commons-collection

3
推荐指数
1
解决办法
1443
查看次数

用于连续输入流的PortAudio实时音频处理

我正在使用PortAudio来实现实时音频处理。

我的主要任务是连续从麦克风获取数据,并提供100个要处理的样本(each FRAME = 100 samples at a time)到其他处理线程。

这是我的回调,每次连续收集100个样本-

static int paStreamCallback( const void* input, void* output,
    unsigned long samplesPerFrame,
    const PaStreamCallbackTimeInfo* timeInfo,
    PaStreamCallbackFlags statusFlags,
    void* userData ) {

    paTestData *data = (paTestData*) userData;
    const SAMPLE *readPtr = (const SAMPLE*)input;   // Casting input read to valid input type SAMPLE (float)
    unsigned long totalSamples = TOTAL_NUM_OF_SAMPLES ; // totalSamples = 100 here

    (void) output;
    (void) timeInfo;
    (void) statusFlags;

    static int count = 1;

    if(data->sampleIndex < count …
Run Code Online (Sandbox Code Playgroud)

c portaudio boost-thread circular-buffer data-structures

3
推荐指数
1
解决办法
2064
查看次数