Чередующиеся функции usleep () выполняются вместе.Это оптимизация компилятора? - PullRequest
0 голосов
/ 05 июня 2019

У меня есть код, который повторяет что-то подобное в цикле:

$ cat test.c
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    char arr[6] = {'h','e','l','l','o','!'};
    for(int x=0; x<6 ; x++){
        printf("%c",arr[x]);
        usleep(1000000);
        printf("%c",arr[x]);
        usleep(1000000);
    }
    printf("\n");

    return 0;
}

Я вижу, что printf() выполняется один за другим БЕЗ какой-либо задержки (из-за usleep),и затем программа спит в течение всего usleep времени в конце перед следующей итерацией.Похоже, в конце концов все вызовы usleep() происходят вместе.

Я пробовал флаг -O0 в gcc, потому что подозревал, что это влияет на оптимизацию компилятора.Но я предполагаю, что флаг -O0 не отключает какую-либо категорию оптимизации, к которой относится этот случай (если моя догадка верна о том, что причиной такого поведения является компилятор).

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

Примечание. Я знаю, что можно заменить usleep() на некоторые вычислительныетяжелый вызов функции, который занимает эквивалентное количество времени, но это не решение, которое я ищу.

1 Ответ

0 голосов
/ 06 июня 2019

Вы используете usleep() неправильно.Вместо этого используйте sleep(1).

С man usleep:

EINVAL usec больше или равно 1000000. (В системах, где это считается ошибкой.)

Как только вы исправите это, вы должны сделать fflush() после printf(), чтобы избежать еще одного сюрприза с буферизацией вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...