目前,我很难发现RPi上多线程C程序的问题是什么。我编写了一个依赖于两个pthread的应用程序,其中一个从gps设备读取数据并将其写入文本文件,第二个使用温度传感器完全相同。在我的笔记本电脑(英特尔®酷睿™i3-380M,2.53GHz)上,我有很好的工作和写入我的文件,直到两个设备发送信息的频率(分别为10赫兹和500赫兹)。
当我编译并执行我的C程序以在RPi上运行时,真正的问题出现了;我的程序在RPi上运行的性能大大降低,我的GPS日志文件以3 Hz的频率写入,温度日志文件的频率为17 Hz(每秒写入17次测量)。
我真的不知道为什么我在PI上运行我的代码会遇到这些性能问题。是不是因为RPi只有700 MHz的ARM处理器,它无法处理这样的多线程应用程序?或者是因为我的两个线程例程正在扰乱通常由PI执行的好工作?非常感谢Guys .... !!!
这是我的代码。我只发布一个线程函数,因为我只用一个线程测试了性能,它仍然以非常低的频率(~4 Hz)写入。首先,主要功能:
int main(int argc, char *argv[]) {
int s1_hand = 0;
pthread_t routines[2];
printf("Creating Thread -> Main Thread Busy!\n");
s1_hand = pthread_create(&(routines[1]), NULL, thread_2, (void *)&(routines[1]));
if (s1_hand != 0){
printf("Not possible to create threads:[%s]\n", strerror(s1_hand));
exit(EXIT_FAILURE);
}
pthread_join(routines[1], NULL);
void* result;
if ((pthread_join(routines[1], &result)) == -1) {
perror("Cannot join thread 2");
exit(EXIT_FAILURE);
}
pthread_exit(NULL);
return 0;
}
现在,第2号线程函数:
void *thread_2(void *parameters) {
printf("Thread 2 starting...\n");
int fd, chars, parsing, c_1, parse, p_parse = 1;
double array[3];
fd = open("dev/ttyUSB0", O_RDONLY | O_NOCTTY | O_SYNC);
if (fd < 0){
perror("Unable to open the fd!");
exit (EXIT_FAILURE);
}
FILE *stream_a, *stream_b;
stream_a = fdopen(fd, "r");
stream_b = fopen (FILE_I, "w+");
if (stream_a == NULL || stream_b == NULL){
perror("IMPOSSIBLE TO CREATE STREAMS");
exit(EXIT_FAILURE);
}
c_1 = fgetc(stream_a);
parse = findit(p_parse, c_1, array);
printf("First Parse Done -> (%i)\n", parse);
while ((chars = fgetc(stream_a)) != EOF){
parsing = findit(0, (uint8_t)chars, array);
if (parsing == 1){
printf("MESSAGE FOUND AND SAVED -> (%i)\n", parsing);
fprintf(stream_b,"%.6f %.3f %.3f %.3f\n", time_stamp(), array[0], array[1], array[2]);
}
}
fflush(stream_b);
fclose(stream_b);
fclose(stream_a);
close(fd);
pthread_exit(NULL);
return 0;
}
请注意,在我的线程2函数中,我使用的是findit(),函数返回0或1,以便在找到并解析来自gps的消息时,在我的数组中写入已解析的信息(0找不到,1找到并解析)。函数time_stamp()只调用clock_gettime(CLOCK_MONOTONIC,&amp; time_stamp)函数,以便在每个写入事件上有时间参考。希望有这些信息,你们可以帮助我。谢谢!
答案 0 :(得分:2)
显然处理器能够每秒运行20件事。我首先检查你的文件系统性能。
编写一个小程序,模拟写入的方式,看看它的表现是什么样的。
除此之外,我建议交换任务导致延误。尝试没有其中一个线程。你得到什么样的表现?
我猜它是文件系统。尝试将写入缓冲到内存中,每隔几秒钟进行大量(4k +)写入,我敢打赌,这样可以让您的系统更快乐。
另外,发布您的代码。否则我们所能做的只是猜测。