鉴于希望从其内容中抽象出循环缓冲区的结构,并从以下代码段开始(由此维基百科条目提供):
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) 关于如何在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
我正在调查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) 我想制作一个循环缓冲区,它有两个索引:
那么,当两个索引处于相同位置时,如何暂停Thread.我的意思是,如果你没有写任何新数据,你就无法读取它,所以如果writeindex和readindex处于相同位置,你只需要编写新数据,而不是读取它.
如何阻止线程直到发生什么?
我需要一个CircularBuffer IDictionary.任何人都可以指出我一个良好的开源实现.
所以IDictionary具有最大容量,比如说配置为100个项目,当添加项目101时,从字典中弹出/删除原始的第一个项目,从而确保项目计数永远不会超过100.
谢谢
我正在使用一个循环数组实现一个队列,我有点陷入resize()方法实现(当数组已满).
在enqueue()方法内部,我检查数组的大小是否等于它的长度,并获得它是否已满.现在,我没有抛出异常,而是试图调整数组的大小.
问题是,我有两个案例需要考虑
将旧数组的元素复制到新的较大数组中的最佳方法是什么?
我认为它使用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) 我有一个数组,我想向后滚动它的位置.
我有一个布尔数组,我需要计算从给定的单元格向前和向后的真实数量.
我知道如果N是数组中元素的数量,我可以继续做i =(i + 1)%N.但是,如果我需要以相反的方式滚动它呢?
先感谢您.
以下是摘自"操作系统概念"第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.请解释整件事.
我正在寻找类似的东西ConcurrentLinkedQueue,但有以下行为:
peek()/ poll()队列中,它检索HEAD,也不会删除它,并且随后前进HEAD一个节点向TAILpeek()/时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
我正在使用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) circular-buffer ×10
java ×4
c ×3
buffer ×2
c# ×2
queue ×2
arrays ×1
boost-thread ×1
collections ×1
dictionary ×1
matlab ×1
optimization ×1
portaudio ×1
resize ×1