У меня проблема с чтением значений в разные промежутки времени относительно производительности. Существует требование, например, читать значения во второй раз, то есть ровно 60 раз в минуту. Другим требованием является чтение разных значений в разные промежутки времени. Чтение может занять неопределенное время, и программа должна заняться этим. Среда - Debian с архитектурой armhf.
Сначала я создал al oop, который использовал такты (в секунду). Однако использование макроса CLOCKS_PER_SE C с функцией clock () и подсчет тиков приводят к тому, что программа использует несколько секунд, когда было достигнуто значение CLOCKS_PER_SE C.
Использование clock_gettime () Функция дает правильное l oop относительно времени. Я считаю, что циклы, пока не будет достигнут временной интервал, не очень эффективны. Кроме того, я полагаю, что будут проблемы с несколькими потоками, считающими разные интервалы времени, например, один поток читает значения каждую секунду, а другой поток читает значения 10 раз в секунду, и еще один поток читает значения 6 раз в минуту. Я включил фрагмент кода, как чтение значений каждую секунду развивается с помощью clock_gettime ().
Есть ли другой способ для l oop через (или ждать) требуемое время? Или я должен разработать один единственный l oop, который проверяет каждую миллисекунду, есть ли какое-либо значение для чтения?
#include<stdio.h>
#include<time.h>
/* reading values from source here */
void read_values()
{
printf("Reading values should happen here.\n");
}
int main()
{
int loop_counter = 0; /* counter how many times runs the inner while loop */
struct timespec beginning, now;
clock_gettime(CLOCK_REALTIME, &now);
/* reading values continuously each second */
while (1)
{
beginning.tv_sec = now.tv_sec;
printf("Loop beginning in Unix time %ld.\n", beginning.tv_sec);
read_values();
/* loops until one second has passed */
while (now.tv_sec == beginning.tv_sec)
{
/* loops here and uses resources,
likely performance issue here */
clock_gettime(CLOCK_REALTIME, &now);
loop_counter++;
}
printf("Run %d times in inner while loop.\n", loop_counter);
loop_counter=0;
}
}