所以我有一个非常高的数据采集速率,达到了16MB/s。我从设备文件中读取4MB的数据到缓冲区,然后进行处理。然而,这种写入再读取的方法对于该项目来说太慢了。我想在C语言中实现双缓冲区。
为了简化我的双缓冲区的想法,我决定不包括从设备文件中读取的步骤。我创建了一个C程序,生成了两个单独的线程readThread和writeThread。我让readThread调用我的swap函数来交换缓冲区的指针。
这种实现很糟糕,因为我在Mutex之外使用了共享内存。我实际上有点尴尬发布它,但至少可以让你了解我试图做什么。然而,我似乎无法想出一种实际的方法来同时读取和写入到不同的缓冲区,然后在两个线程完成读取和写入后调用交换函数。
请问是否有可能实现双缓冲区,并给我一个如何使用信号控制线程读写的想法?
请注意,readToBuff(愚蠢的名称,我知道)和writeToBuff目前实际上没有做任何事情,它们只是空函数。
以下是我的代码:
为了简化我的双缓冲区的想法,我决定不包括从设备文件中读取的步骤。我创建了一个C程序,生成了两个单独的线程readThread和writeThread。我让readThread调用我的swap函数来交换缓冲区的指针。
这种实现很糟糕,因为我在Mutex之外使用了共享内存。我实际上有点尴尬发布它,但至少可以让你了解我试图做什么。然而,我似乎无法想出一种实际的方法来同时读取和写入到不同的缓冲区,然后在两个线程完成读取和写入后调用交换函数。
请问是否有可能实现双缓冲区,并给我一个如何使用信号控制线程读写的想法?
请注意,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);
}