Tag: 循环缓冲区

当缓冲区小于生产者的输入时,生产者/消费者似乎陷入僵局

我创建了一个循环缓冲区,其中有多个客户端写入(最后我希望它们将不同大小的消息写入)到缓冲区中。 服务器将它们读出来。 它基于消费者/生产者问题中的代码: #include #include #include #include #include #define BUFFER_SIZE 10 struct cBuf{ char *buf; int size; int start; int end; pthread_mutex_t mutex; pthread_cond_t buffer_full; pthread_cond_t buffer_empty; }; struct cBuf cb; void buf_Init(struct cBuf *cb, int size) { int i; cb->size = size + 1; cb->start = 0; cb->end = 0; cb->buf = (char *)calloc(cb->size, […]

在单个线程中使用循环缓冲区的可能性

我有一个UDP线程,它通过来自不同多路复用流的recvmmsg系统调用读取多个数据报,并将它们推送到不同的循环/环形缓冲区。 这些环形缓冲区是Stream结构的一部分。 每个流每20ms发送一个语音帧。 因此UDP数据包可能如下所示:F1S1 F1S2 F1S3 F2S1依此类推或者如果出现突发情况,它可能如下所示:F1S1 F2S1 F3S1 F1S2,依此类推。 在接收之后,这些数据包将由一个按照ITP原理工作的库并行处理。 UDP线程必须将这些parllel任务与要处理的数据包列表一起分派。 这里的限制是任务不能从SAME流并行处理两个帧。任务必须有自己独立的内存用于帧处理。 所以我需要确保这些帧的FIFO执行顺序,这将在我产生这些任务之前在UDP线程中完成。 目前,当我收到这些数据包时,我查找streamId并将帧放在循环缓冲区中,该缓冲区是带有for_loop的Stream Strctures的一部分。 这是代码,显示UDP线程中发生的事情。 while (!(*thread_stop)) { int nr_datagrams = recvmmsg(socket_handle->fd_udp, datagramS, VLEN, 0, NULL); ….. for (int i = 0; i circBuff.seqNum[codecPtr->circBuff.newestIdx] = _seq_num; // Update the entry pointer to point to the newest frame codecPtr->circBuff.entries = codecPtr->circBuff.entries + codecPtr->circBuff.newestIdx * […]

以线程安全的方式从环形缓冲区复制目标C中的数据

我对这段代码的结果感到困惑: 在一个线程中,我正在写入环形缓冲区(请参阅此处的环形缓冲区的实现): – (void)appendToRingBuffer:(Packet *)packet { int32_t length = ((PacketAudioBuffer *)packet).totalSize; void *writePointer; bytesAvailableToWrite = [ringBuffer lengthAvailableToWriteReturningPointer:&writePointer]; memcpy(writePointer, [((PacketAudioBuffer *)packet).audioBufferData bytes], length); [ringBuffer didWriteLength:length]; //updates ring buffer head pointer } 在另一个线程中,我正在读取它(并将数据复制到NSData变量): -(BOOL)readFromRingBuffer { void *readPointer; allBytesAvailable = [ringBuffer lengthAvailableToReadReturningPointer:&readPointer]; ringBufferReadData = [NSData dataWithBytes:readPointer length:allBytesAvailable]; [ringBuffer didReadLength:allBytesAvailable]; // purges read data from ring buffer // do […]

如何在C / C ++中编写简单的整数循环缓冲区?

我看到很多模板和复杂的数据结构用于实现循环缓冲区。 如何为5个数字编码一个简单的整数循环缓冲区? 我在想C是最直截了当的吗? 谢谢。