Небольшое приложение для Linux порождает поток SCHED_FIFO и спит.Длительное нажатие блокирует систему - PullRequest
2 голосов
/ 24 августа 2011

Запуск приведенного ниже кода (скомпилированного с -lpthread) в многоядерной системе (Ubuntu 11.04 x86-32), которая просто порождает поток SCHED_FIFO и переходит в спящий режим, отображает некоторое странное поведение.Если вы нажмете клавишу, она будет хорошо отражена.Однако, если вы удерживаете нажатой клавишу, процесс зависнет, и вам потребуется перезагрузить аппарат (программная перезагрузка зависает, как и kill -9).Делать то же самое через сеанс telnet работает просто отлично.

#include <sched.h>
#include <pthread.h>
#include <assert.h>

void* schedtest_busy_wait_thread_entry(void *arg)
{
    struct sched_param sp;

    sp.__sched_priority = sched_get_priority_min(SCHED_FIFO);
    assert(sched_setscheduler(0, SCHED_FIFO, &sp) == 0);
    while (1);
    return NULL;
}

int main(int argc, char **argv)
{
    pthread_t thread_id;

    assert(pthread_create(&thread_id, NULL, schedtest_busy_wait_thread_entry, NULL) == 0);
    while (1) sleep(1);
    return 0;
}

Очевидно, что это просто отрывок из гораздо более крупной и сложной системы, которая требует занятого ожидающего потока SCHED_FIFO (с жестко закодированной привязкой), но отображает этотакое же поведение/ proc / sys / kernel / sched_rt_runtime_us по умолчанию 950000.

Есть ли какие-либо указатели?

...