Я написал простую программу, которая реализует схему мастер / рабочий, где мастер является основным потоком, а рабочие создаются им.
Основной поток записывает что-то в общий буфер, а рабочие потоки читают этот общий буфер, запись и чтение в общий буфер организуются с помощью блокировки чтения / записи.
К сожалению, эта схема определенно приводит к истощению основного потока, так как для завершения одной записи требуется несколько операций чтения. Одним из возможных решений является повышение приоритета главного потока, поэтому, если он захочет что-то записать, он получит немедленный доступ к общему буферу.
Согласно отличному сообщению , посвященному аналогичной проблеме, я обнаружил, что, вероятно, недопустимо манипулировать приоритетом потока в политике SCHED_OTHER
, что можно изменить только значением nice
.
Я написал процедуру, чтобы дать рабочим потокам более низкий приоритет, чем основному потоку, но, похоже, он работает неправильно.
void assignWorkerThreadPriority(pthread_t* worker)
{
struct sched_param* worker_sched_param = (struct sched_param*)malloc(sizeof(struct sched_param));
worker_sched_param->sched_priority =0; //any value other than 0 gives error?
int policy = SCHED_OTHER;
pthread_setschedparam(*worker, policy, worker_sched_param);
printf("Result of changing priority is: %d - %s\n", errno, strerror(errno));
}
У меня двоякий вопрос:
- Как установить приятное значение рабочих потоков, чтобы избежать истощения основного потока.
- Если это невозможно, то как я могу изменить политику планирования на такую, которая позволяет изменять приоритет.
Редактировать: мне удалось запустить программу с использованием других политик, таких как SCHED_FIFO
, все, что мне нужно было сделать, это запустить программу как суперпользователь