Вам потребуются дополнительные привилегии для уменьшения хорошего значения (увеличение логического приоритета). В Linux это означает, что он выполняется от root или имеет возможность CAP_SYS_NICE. Оба могут быть установлены для двоичного исполняемого файла (либо setuid root через chown и chmod, либо setcap). Первый будет работать на всех Unix-подобных системах (но будет требовать привилегии root при установке), но последний имеет специфику Linux.
Наиболее приемлемым переносным способом, вероятно, является создание программы-обертки, в которой может быть установлен корень setuid. Это будет очень просто, всего несколько десятков строк C. Он просто вызывает sched_get_priority_min(), sched_get_priority_max(), sched_setscheduler() и sched_setparam(), чтобы опустить хорошее значение (получая его больше времени процессора), а затем вызывает seteuid (0); setregid (getgid(), getgid); setreuid (getuid(), getuid()); для удаления дополнительных привилегий и, наконец, execv() фактической программы. Примечание: вам наиболее определенно нужно жестко указать путь к реальной программе во время установки. Это должно работать без изменений во всех Linux и Unix-подобных системах.
В вашей реальной программе вы просто увеличиваете тонкость нитей, которые не так важны. Другими словами, вы не пытаетесь снизить привлекательность любых потоков в своей программе, но увеличиваете привлекательность всех других потоков. Программа корневой оболочки setuid - это переносимый способ уменьшить минимальный уровень удовлетворенности. Вы можете, очевидно, проверить текущую информацию о тонкости и планировщике, чтобы увидеть, есть ли достаточный диапазон для настройки. Возможно, ваша программа-обертка может устанавливать параметры командной строки или переменные среды, которые указывают фактическую программу, какие уровни приоритета использовать.
проблема в том, что моя программа должна увеличивать и понижать динамику. –