printf в теме RT - PullRequest
       5

printf в теме RT

0 голосов
/ 03 июня 2018

Я пишу многопоточное приложение в Linux.

В ядре нет исправлений RT, но я использую потоки с приоритетами.

При проверке времени, которое требуется для выполнения printf, я измеряю разные значения каждый раз, когда измеряю, хотя это делается в потоке с наивысшим приоритетом:

if(clock_gettime(CLOCK_MONOTONIC, &start))
{ /* handle error */ 
}

for(int i=0; i< 1000; i++)
   printf("hello world");

if(clock_gettime(CLOCK_MONOTONIC, &end))
{ 
 /* handle error */ 
}
elapsedSeconds = TimeSpecToSeconds(&end) - TimeSpecToSeconds(&start);

Почему printf меняет время и недетерминированным образом, то есть каждый Как следует printf использоваться с потоками RT?

Можно ли его использовать внутри потока RT или его следует полностью избегать?

Неужели write к диску следует обрабатывать так же, как printf?Должен ли он использоваться только в отдельном потоке с низким приоритетом?

1 Ответ

0 голосов
/ 03 июня 2018

printf под капотом запускает механизм нереализованного (даже блокирующего) буферизованного ввода-вывода.

Он не только недетерминирован, но открывает возможность инверсии приоритета .

Вы должны быть очень осторожны, используя его из потока реального времени (я бы сказал, полностью избегайте его.

Обычно в коде с привязкой к задержке вы используете бинарный аудит без ожидания вцепочка (предварительно выделенных или отображенных в память) кольцевых буферов и очистка их с помощью фонового потока с более низким приоритетом (или даже отдельного процесса).

...