所以我有非常高的16MB/s的数据采集率。我正在将4MB数据从设备文件读入缓冲区,然后对其进行处理。但是,这种写作和阅读的方法会让项目变慢。我想在C中实现一个双缓冲区。为了简化我对双缓冲区的想法,我决定不包括从设备文件读取以简化读取操作。我创建的是一个C程序,它产生两个独立的线程readThread和writeThread。我让readThread调用我的交换函数,交换缓冲区的指针。在C中实现双缓冲区
这个实现很糟糕,因为我使用互斥量之外的共享内存。我其实有点尴尬地发布它,但它至少会让你知道我正在尝试做什么。但是,我似乎无法提出一种实际的读取和写入方式来同时分离缓冲区,然后在两个线程完成写入和读取操作后调用swap。
有人可以告诉我,如果它可能实现双缓冲,并给我一个如何使用信号来控制线程读取和写入的想法?
请注意,readToBuff(我知道的愚蠢名称)和writeToBuff实际上目前没有做任何事情,它们有空白功能。
这里是我的代码:
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
pthread_t writeThread;
pthread_t readThread;
pthread_mutex_t buffer_mutex;
char buff1[4], buff2[4];
struct mutex_shared {
int stillReading, stillWriting, run_not_over;
char *writeBuff, *readBuff;
} SHARED;
void *writeToBuff(void *idk) {
while(!SHARED.run_not_over) {
SHARED.stillWriting = 1;
for(int i = 0; i < 4; i++) {
}
SHARED.stillWriting = 0;
while(SHARED.stillReading){};
}
printf("hello from write\n");
return NULL;
}
void *readToBuff(void *idk) {
while(!SHARED.run_not_over) {
SHARED.stillReading = 1;
for(int i = 0; i < 4; i++) {
}
while(SHARED.stillWriting){};
swap(writeThread,readThread);
}
printf("hello from read");
return NULL;
}
void swap(char **a, char **b){
pthread_mutex_lock(&buffer_mutex);
printf("in swap\n");
char *temp = *a;
*a = *b;
*b = temp;
SHARED.stillReading = 0;
//SHARED.stillWriting = 0;
pthread_mutex_unlock(&buffer_mutex);
}
int main() {
SHARED.writeBuff = buff1;
SHARED.readBuff = buff2;
printf("buff1 address %p\n", (void*) &buff1);
printf("buff2 address %p\n", (void*) &buff2);
printf("writeBuff address its pointing to %p\n", SHARED.writeBuff);
printf("readBuff address its pointing to %p\n", SHARED.readBuff);
swap(&SHARED.writeBuff,&SHARED.readBuff);
printf("writeBuff address its pointing to %p\n", SHARED.writeBuff);
printf("readBuff address its pointing to %p\n", SHARED.readBuff);
pthread_mutex_init(&buffer_mutex,NULL);
printf("Creating Write Thread\n");
if (pthread_create(&writeThread, NULL, writeToBuff, NULL)) {
printf("failed to create thread\n");
return 1;
}
printf("Thread created\n");
printf("Creating Read Thread\n");
if(pthread_create(&readThread, NULL, readToBuff, NULL)) {
printf("failed to create thread\n");
return 1;
}
printf("Thread created\n");
pthread_join(writeThread, NULL);
pthread_join(readThread, NULL);
exit(0);
}
你的编译器是否抱怨这行'swap(writeThread,readThread);'? – ccpgh
如果您要提高性能,这种双缓冲解决方案不太可能满足需求。看看[循环缓冲区](https://en.wikipedia.org/wiki/Circular_buffer)(a/k/a环形缓冲区)。 –
我同意@PeretteBarella。这就是他们通常在高性能音频应用和其他高数据速率输入源中使用的。如果您必须等待阅读器或写入器停止运行,那么性能会受到影响,并且锁定和信号也会产生开销。 – clearlight