Планирование потоков (не процессов) на основе приоритетов

У меня есть процесс, который содержит две темы. Я хочу запланировать их на основе их priority(SCHED_RR policy), Пусть t1, t2 обозначают эти потоки, оба изначально имеют приоритет 1 (самый низкий).

Я хочу убедиться, что мой поток t1 не прерван / перепланирован во время выполнения критической задачи - поэтому я повышаю его приоритет до максимума перед критической задачей и уменьшаю его до исходного значения после критической задачи:

thread_proc_t1() {
    while(1) {
        if(critical condition happens) {
            set_priority_max();
        }
        printf("t1");
        usleep(xxx);
        if(critical task finished ) {
            reset_priority();
        }
    }   
}

thread_proc_t2() {
    while(1) {
        printf("t2");
        usleep(xxx);
    }   
}

Я ожидаю printf() команды в потоке t2 не должны выполняться после того, как я позвонил set_priority_max() в теме т1. Но вывод также содержит отпечатки из потока t2.

  1. Почему это так?

  2. Как я могу решить эту проблему?

1 ответ

Решение

Там нет проблем, это ожидаемое поведение.

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

Во-вторых, ваш высокоприоритетный поток спит, что дает время для работы с более низким приоритетом.

В-третьих, ваши потоки взаимодействуют через блокировку, которая защищает стандартный вывод. Поток с более высоким приоритетом может ожидать этой блокировки, что позволяет запускать потоки с более низким приоритетом.

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

Другие вопросы по тегам