Планирование потоков (не процессов) на основе приоритетов
У меня есть процесс, который содержит две темы. Я хочу запланировать их на основе их 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 ответ
Там нет проблем, это ожидаемое поведение.
Во-первых, если у вас более одного ядра, приоритеты не будут иметь значения, если число готовых к запуску потоков меньше, чем ядер - каждый поток получит свое собственное ядро.
Во-вторых, ваш высокоприоритетный поток спит, что дает время для работы с более низким приоритетом.
В-третьих, ваши потоки взаимодействуют через блокировку, которая защищает стандартный вывод. Поток с более высоким приоритетом может ожидать этой блокировки, что позволяет запускать потоки с более низким приоритетом.
Пожалуйста, не пытайтесь использовать приоритеты таким образом. Это добавляет огромную сложность, снижает производительность и редко приводит к чему-либо полезному.