Автор Тема: Смена приоритета потока  (Прочитано 5050 раз)

Оффлайн anton1301

  • Участник
  • *
  • Сообщений: 103
Смена приоритета потока
« : 22.04.2013 22:39:27 »
Прошу прощения, мои темы здесь уже напоминают флуд, но у меня новый вопрос, причем не знаю куда мне его на этом форуме адресовать, ведь вопрос по программированию в Linux. Прошу прощения у администрации, если что не так.

Суть вопроса такова: Надо поменять приоритет потоков, выводящих на экран буквы (один выводит А, другой - B). После вывода буквы каждый поток засыпает на секунду. Таким образом, буквы появляются равномерно с интервалом в секунду - то есть ABABABABABA.... Затем надо поменять приоритеты и посмотреть как равномерный вывод будет нарушаться.

Я бы не задавал вопрос, если бы так и не нашел способ, позволяющий поменять приоритет процесса при помощи linapi.

Код у меня такой:

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <pthread.h>
void * thread_func_A(void *arg)
{
    int i;
    //int loc_id = * (int *) arg;
    for (i = 0; i < 10; i++)
    {
        printf("A");
        sleep(1);
    }
}
void * thread_func_B(void *arg)
{
    int i;
    //int loc_id = * (int *) arg;
    for (i = 0; i < 10; i++)
    {
        printf("B");
        sleep(1);
    }
}

int main(int argc, char * argv[])
{
    int id1, id2, result;
    pthread_t thread1, thread2;
    id1 = 1;
    result = pthread_create(&thread1, NULL, thread_func_A, &id1);
    if (result != 0)
    {
        perror("Creating the first thread");
        return EXIT_FAILURE;
    }
    id2 = 2;
    result = pthread_create(&thread2, NULL, thread_func_B, &id2);
    if (result != 0)
    {
        perror("Creating the second thread");
        return EXIT_FAILURE;
    }
    result = pthread_join(thread1, NULL);
    if (result != 0)
    {
        perror("Joining the first thread");
        return EXIT_FAILURE;
    }
    result = pthread_join(thread2, NULL);
    if (result != 0)
    {
        perror("Joining the second thread");
        return EXIT_FAILURE;
    }
    printf("\nDone\n");
    return EXIT_SUCCESS;
}

Всё есть - не хватает функций для смены приоритета. ну не найду я их. Может кому-то не составит труда подсказать?

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 361
  • Учиться .... Телепатами не рождаются, ими ....
Re: Смена приоритета потока
« Ответ #1 : 22.04.2013 23:41:24 »
Что-нибудь типа nice
man 2 nice
и в нём ссылки на другие команды работы с приоритетом. Только боюсь, приоритет снизится у всего процесса.

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 20 159
    • Домашняя страница
Андрей Черепанов (cas@)

Оффлайн anton1301

  • Участник
  • *
  • Сообщений: 103
Re: Смена приоритета потока
« Ответ #3 : 23.04.2013 21:50:12 »
Большое спасибо, работает. Только я долго промучился: вроде бы код был правильный, а  pthread_setschedparam(...)  возвращает 1. Оказалось, что такие программы надо запускать от рута (я через sudo запускал). Не думал, что оно настолько сурово:)

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 20 159
    • Домашняя страница
Re: Смена приоритета потока
« Ответ #4 : 24.04.2013 08:07:58 »
Надо смотреть в сторону chmod u+s
Андрей Черепанов (cas@)

Оффлайн anton1301

  • Участник
  • *
  • Сообщений: 103
Re: Смена приоритета потока
« Ответ #5 : 24.04.2013 22:38:28 »
Всё получилось (функции смены приоритета вернули 0). Но вызывает вопросы вот что: поток, выводящий 100 раз 'A', имеющий высший приоритет, иногда завершается позже, чем поток, выводящий 100 раз 'B', имеющий низший приоритет при той же политике. policy у обоих SCHED_FIFO. Как такое возможно?

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 361
  • Учиться .... Телепатами не рождаются, ими ....
Re: Смена приоритета потока
« Ответ #6 : 24.04.2013 23:13:41 »
Во-первых, помимо приоритета, на время выполнения влияет время обращения к внешнему устройству, т.е. дисплею, во-вторых помимо статического приоритета, существует динамический, который зависит от того, сколько процесс уже использовал процессорное время. Статический приоритет, это только начальное значение приоритета, которое снижается при работе процесса, и повышается при его простое.
« Последнее редактирование: 24.04.2013 23:15:19 от ruslandh »

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 361
  • Учиться .... Телепатами не рождаются, ими ....
Re: Смена приоритета потока
« Ответ #7 : 24.04.2013 23:17:04 »
А в третьих, по-умолчанию, printf отрабатывает не сразу, а после полного заполнения его буфера.

Оффлайн anton1301

  • Участник
  • *
  • Сообщений: 103
Re: Смена приоритета потока
« Ответ #8 : 25.04.2013 00:23:48 »
Теперь ясно. Спасибо:)

Оффлайн Peter_

  • Участник
  • *
  • Сообщений: 105
Re: Смена приоритета потока
« Ответ #9 : 25.04.2013 20:47:46 »
Теперь ясно. Спасибо:)
А чтобы выводил сразу, сбрасывайте буфер: fflush(stdout);

Пётр.
Пётр.

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 361
  • Учиться .... Телепатами не рождаются, ими ....
Re: Смена приоритета потока
« Ответ #10 : 26.04.2013 00:14:27 »
А можно ещё задать отмену буфферизации через setbuf.

Оффлайн anton1301

  • Участник
  • *
  • Сообщений: 103
Re: Смена приоритета потока
« Ответ #11 : 07.05.2013 20:39:16 »
А можно ещё задать отмену буфферизации через setbuf.

А разве setbuf применяется не только для файлов?

http://c2p.ru/c/setbuf.html

У меня просто вывод в терминал, поэтому мне поможет только fflush(stdout);

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

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 361
  • Учиться .... Телепатами не рождаются, ими ....
Re: Смена приоритета потока
« Ответ #12 : 07.05.2013 20:54:33 »
Цитата: man stdout
STDIN(3)                                   Linux Programmer's Manual                                   STDIN(3)

NAME
       stdin, stdout, stderr - standard I/O streams

SYNOPSIS
       #include <stdio.h>

       extern FILE *stdin;
       extern FILE *stdout;
       extern FILE *stderr;

stdout - это то-же файл

Оффлайн anton1301

  • Участник
  • *
  • Сообщений: 103
Re: Смена приоритета потока
« Ответ #13 : 07.05.2013 21:14:17 »
stdout - это то-же файл

Ааа, тогда кажется ясно. Если здесь FILE *stream - stdout:
void setbuf (FILE *stream, char *buf);
то для отмены буферизации во всех потоках за один раз и до конца выполнения программы, надо в main() прописать:

setbuf (stdout, NULL);