Страниц: [1]
  Печать  
Автор Тема: Вопрос о приоритетах потока  (Прочитано 5294 раз)
NIV
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« : Апреля 29, 2005, 12:57:17 pm »

Здравствуйте.

В процессе работают три потока, плюс обработчик прерывания от PCI платы. Основной поток после инициализации блокируется на JOIN, второй поток постоянно слушает сеть на предмет поступления команд. Третий поток, собственно, и выполняет всю работу, работая в бесконечном цикле. Внутри цикла поток блокируется на прием импульса, посылаемого обработчиком прерывания (используется InterruptAttach()). Далее, в зависимости от состояния системы, выполняются разные действия, причем если требуемое на это время больше чем интервал поступления запросов прерывания, то прерывания маскируются.
Теперь вопрос. Пытаюсь повысить приоритет третьего потока, который переходит в REDY после ISR.
Делаю так:

pthread_t thread_1;
pthread_attr_t attr_1;
pthread_attr_init( &attr_1 );
pthread_attr_setinheritsched( &attr_1, PTHREAD_EXPLICIT_SCHED );
pthread_attr_setschedpolicy( &attr_1, SCHED_RR );
attr_1.param.sched_priority = 15;
pthread_create(&thread_1, &attr_1, cardinalThread, NULL);

Все как в «Введение в QNX ...»
Все хорошо работает, но команда pidin показывает, что ВСЕ потоки внутри процесса работают с приоритетом 10r. Собственно в «Ведении в QNX ...» (стр. 50) результат тот же. Так все таки, с каким приоритетом реально работает поток.

QNX6.1 SE

Заранее благодарю.
ЗЫ. Прошу прощения если в вопросе много воды. Это мой первый проект под QNX (в общем то первый не под виндой)
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #1 : Апреля 29, 2005, 01:14:59 pm »

NIV
Так все таки, с каким приоритетом реально работает поток.

С тем что и написано - 10 Вы ошибки проверяете, что pthread* функции возвращают ?

Как я понял - не получилось поднять приоритет ? Я внутри потока поднимаю его так:

struct sched_param param;

/* increasing default 10 priority to 25 to avoid jerky sound */
status=SchedGet(0, 0, &param);
param.sched_priority=param.sched_curpriority+15;
status=SchedSet(0, 0, SCHED_NOCHANGE, &param);

Но это QNX only код.

NIV
QNX6.1 SE

Обновить не хотите ?
Записан

Lendl
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #2 : Апреля 29, 2005, 01:25:58 pm »

NIV

pthread_create(&thread_1, &attr_1, cardinalThread, NULL);

Правильнее было-бы сделать так:
if(pthread_create(&thread_1, &attr_1, cardinalThread, NULL)!=EOK)
{
//вывести ошибку...
}
Функция cardinalThread() должна быть определена как:
void *cardinalThread ( void *arg )

Если потоки создаются внутри main(), причем Ваш третий поток не есть сам поток-main, то поток должен работать с приоритетом 15r.
Записан
Shrek
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #3 : Апреля 29, 2005, 01:34:17 pm »

Существует два потока А и В
потокок В посылает импульс потоку А.

В зависимости от параметров потоков и импульсов
на время выполнения потока А его приоритет может снижаться или повышатся в зависимости от свойств потова В и импульса.

Может я не совсем понятно обьяснил, гуру поправят
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #4 : Апреля 29, 2005, 01:45:16 pm »

NIV
pthread_attr_init( &attr_1 );
pthread_attr_setinheritsched( &attr_1, PTHREAD_EXPLICIT_SCHED );
pthread_attr_setschedpolicy( &attr_1, SCHED_RR );
attr_1.param.sched_priority = 15;

И еще, тут не хватает:

что-то такого c pthread_attr_setschedparam:

pthread_attr_t tattr;
int newprio;
sched_param param;


/* set the priority; others are unchanged */
newprio = 30;
param.sched_priority = newprio;

/* set the new scheduling param */
ret = pthread_attr_setschedparam (&tattr, &param);
Записан

NIV
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #5 : Апреля 29, 2005, 02:03:31 pm »

Насколько я понял у Роба Кертенера (или как там его склонять ) pthread_attr_setschedparam() необязательно использовать, а можно просто присвоить приоритет следующим образом

attr.param.shed_priotity = newprio;

Насчет проверки ошибок: все ошибки проверяются, все функции возвращают EOK.
Способ, предложенный lestat тоже не помог.

А вот с импульсом интересно. Заменил

SIGEV_PULSE_INIT( &event, coid, SIGEV_PULSE_PRIO_INHERIT, 0, 0 );

на

SIGEV_PULSE_INIT( &event, coid, 30, 0, 0 );

и приоритет потока сразу изменился на 30.
Почему приоритет изменился понятно, почему не менялся с SIGEV_PULSE_PRIO_INHERIT не понятно. Насколько я понял из документации, SIGEV_PULSE_PRIO_INHERIT просто не дает менять приоритет потока после приема импульса
Записан
Lendl
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #6 : Апреля 29, 2005, 02:04:29 pm »

lestat

pthread_attr_t tattr;
int newprio;
sched_param param;


/* set the priority; others are unchanged */
newprio = 30;
param.sched_priority = newprio;

/* set the new scheduling param */
ret = pthread_attr_setschedparam (&tattr, &param);


Это все NIV сделал одной командой прямого присвоения:
attr_1.param.sched_priority = 15;
Здесь все верно.
Записан
Shrek
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #7 : Апреля 29, 2005, 02:34:42 pm »


Почему приоритет изменился понятно, почему не менялся с SIGEV_PULSE_PRIO_INHERIT не понятно. Насколько я понял из документации, SIGEV_PULSE_PRIO_INHERIT просто не дает менять приоритет потока после приема импульса


Где то  в форуме уже эта тема обсуждалась.
ТОчно не помню, но есть там небольшие хитрости от самой QSSL
Записан
NIV
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #8 : Апреля 29, 2005, 02:51:14 pm »

В общем, изменение приоритета потока по импульсу меня, пока, вполне устраивает.
 
Всем большое спасибо за участие.
Записан
mike
QOR.Moderator
*****
Offline Offline

Сообщений: 1186


Welcome to Lunatic Asylum.


Просмотр профиля WWW
« Ответ #9 : Апреля 29, 2005, 07:50:07 pm »

"Lendl"
Здесь все верно.

верно, но неправильно
вы можете быть уверены, что pthread_attr_setschedparam() будет выглядеть так http://cvs.qnx.com/cgi-bin/cvsweb.cgi/~checkout~/lib/c/1c/pthread_attr_setschedparam.c?rev  =1.1.1.1&content-type=text/plain и дальше? а на другой платформе?
я, нет.
Записан
Страниц: [1]
  Печать  
 
Перейти в: