pthread хорошая настройка значения для планировщика по умолчанию в C - PullRequest
0 голосов
/ 15 января 2020

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

#include <stdio.h> 
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/resource.h>

static int var = 0;

void *my_inc()
{
    setpriority(PRIO_PROCESS, pthread_self(), -10);
    printf("thread 1 within  %d \n", getpriority(PRIO_PROCESS, pthread_self()));
    for(int i = 1; i < 10; i++)
    {
        var = i;
        sleep(1);
        printf("hi ");
    }

    pthread_exit(NULL);    
}

void *my_print()
{    
    while(1)
    {
        printf("var %d\n", var);
        sleep(1);
    }
}

int main(void)
{
    pthread_t thread_id1, thread_id2, thread_id3;

    pthread_create(&thread_id1, NULL, my_inc, NULL);
    printf("thread 1 before %d \n", getpriority(PRIO_PROCESS, thread_id1));
    setpriority(PRIO_PROCESS, thread_id1, -10);      

    pthread_create(&thread_id3, NULL, my_print, NULL);    
    setpriority(PRIO_PROCESS, thread_id3, 10);

    printf("thread 3 after %d \n", getpriority(PRIO_PROCESS, thread_id3));
    printf("thread 1 after %d \n", getpriority(PRIO_PROCESS, thread_id1));

    for(int j = 0; j < 20; j++)
    {
        printf("main %d ", j);
        sleep(1);
    }

    pthread_join(thread_id1, NULL);
    exit(0); 
    pthread_exit(NULL);
    printf("After thread\n");
    return 0;
}

Ответы [ 2 ]

1 голос
/ 15 января 2020

Мне непонятно, с чего вы взяли, что функция setpriority() будет в любом случае применима к задаче, которую вы пытаетесь выполнить. Из документов:

Функция setpriority() должна устанавливать значение nice процесса, группы процессов или пользователя [...].

Поток ни один из них.

Более того,

кто интерпретируется относительно , который (идентификатор процесса для PRIO_PROCESS, группа процессов идентификатор для PRIO_PGRP и идентификатор пользователя для PRIO_USER).

Вы указываете PRIO_PROCESS и передаете идентификатор потока, но идентификатор потока не является идентификатором процесса. pthread_t даже не обязательно должен быть целочисленным типом, в отличие от pid_t. Поэтому неудивительно, что setpriority() завершается ошибкой, возвращая -1 и устанавливая errno соответствующим образом. Вы бы знали, что это происходило, если бы вы правильно проверяли результаты вызовов функций на наличие кодов ошибок.

Возможно, вы можете достичь своей цели с помощью функции pthread_setschedprio().

0 голосов
/ 15 января 2020

Если вы получаете -1, у вас, вероятно, есть ошибка: от man 2 getpriority:

   On success, getpriority() returns the calling thread's nice value,
   which may be a negative number.  **On error, it returns -1 and sets
   errno to indicate the cause of the error.**  Since a successful call to
   getpriority() can legitimately return the value -1, it is necessary
   to clear the external variable errno prior to the call, then check it
   afterward to determine if -1 is an error or a legitimate value.

Также: по моему опыту, "nicenecess" не так уж много эффект. Если у вас есть процесс, интенсивно использующий процессор (вероятно, потребляющий целые временные интервалы без паузы для ввода-вывода ...),"вежливо" назначить этому процессу приятное значение, которое будет побудить планировщика поставить его в фоновом режиме. Но современные планировщики, как правило, намного умнее и осведомленнее, чем их предшественники. Как правило, они принимают это решение самостоятельно, без намека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...