1

目前,我很难发现我在 RPi 上的多线程 C 程序存在什么问题。我编写了一个依赖于两个 pthread 的应用程序,其中一个从 gps 设备读取数据并将其写入文本文件,第二个执行完全相同,但使用温度传感器。在我的笔记本电脑(英特尔® 酷睿™ i3-380M,2.53GHz)上,我的程序运行良好,并以两个设备发送信息的频率(分别为 10 Hz 和 500 Hz)写入我的文件。

当我编译并执行我的 C 程序以在 RPi 上运行时,真正的问题出现了。我的程序在 RPi 上运行的性能大大降低,我的 GPS 日志文件以 3 Hz 的频率写入,温度日志文件以 17 Hz 的频率写入(每秒写入 17 次测量)。

我真的不知道为什么我的代码在 PI 上运行时会出现这些性能问题。是因为 RPi 只有一个 700 MHz 的 ARM 处理器,无法处理这样的多线程应用程序吗?还是因为我的两个线程例程扰乱了 PI 通常执行的出色工作?提前非常感谢伙计们....!!!

这是我的代码。我只发布了一个线程函数,因为我只用一个线程测试了性能,它仍然以非常低的频率(~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(),如果找到并解析来自 gps 的消息,则返回 0 或 1 的函数,将解析的信息写入我的数组(0 未找到,1 找到并解析) . 函数 time_stamp() 只需调用 clock_gettime(CLOCK_MONOTONIC, &time_stamp) 函数,以便对每个书面事件都有时间参考。希望有了这些信息,你们可以帮助我。谢谢!

4

1 回答 1

3

显然,处理器每秒能够运行 20 件事情。我首先检查您的文件系统性能。

编写一个小程序,以您正在执行的方式模拟写入,并查看性能如何。

除此之外,我建议是任务交换导致延迟。尝试不使用任何线程。你得到什么类型的性能?

不过,我猜这是文件系统。尝试将您的写入缓冲到内存中并每隔几秒执行一次大型(4k+)写入,我敢打赌这会让您的系统更快乐。

另外,发布您的代码。否则我们只能猜测。

于 2013-08-24T23:16:55.900 回答