Страниц: [1]
  Печать  
Автор Тема: Не работают флаги PTHREAD_CANCEL_* в pthread_attr_t  (Прочитано 2599 раз)
gleb
Участник
*
Offline Offline

Сообщений: 18


Просмотр профиля
« : Января 24, 2004, 10:33:55 am »

Странно, но это так. Про то, что они должны работать написано в help-neutrino-pthread_create()-QNX extensions. Устанавливаем флаг PTHREAD_CANCEL_DISABLE или PTHREAD_CANCEL_ASYNCHRONOUS  в pthread_attr_t, и получаем, что они ни на что не влияют. В то же время флаг PTHREAD_EXPLICIT_SCHED, например, в этой же программе работает нормально. Текст программы:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <pthread.h>

void* ThreadFunc(void*)
{
  int Temp, i;
  printf( "ThreadFunc: start\n" );
  int Policy;
  struct sched_param Param;
  pthread_getschedparam(pthread_self(), &Policy, &Param);
  printf(
    "(Policy==SCHED_FIFO)=%d,(Policy==SCHED_RR)=%d\n",
   (Policy==SCHED_FIFO), (Policy==SCHED_RR) );
  for( i=0; i<2; i++ ) {
    pthread_setcancelstate( PTHREAD_CANCEL_DISABLE,
      &Temp );
    printf("(OldState==PTHREAD_CANCEL_ENABLE)=%d\n",
      Temp==PTHREAD_CANCEL_ENABLE );
    printf("(OldState==PTHREAD_CANCEL_DISABLE)=%d\n",
      Temp==PTHREAD_CANCEL_DISABLE );
  }
  return 0;
}

int main()
{
  pthread_attr_t Attr;
  pthread_t TId;
  struct sched_param SchedParam;
 
  pthread_attr_init( &Attr );
  pthread_attr_setschedpolicy( &Attr, SCHED_FIFO );
  memset( &SchedParam, 0, sizeof(SchedParam) );
  SchedParam.sched_priority = 10;
  pthread_attr_setschedparam( &Attr, &SchedParam );
  Attr.flags |= PTHREAD_EXPLICIT_SCHED;
  Attr.flags |= PTHREAD_CANCEL_DISABLE;
 
  int R = pthread_create( &TId, &Attr, ThreadFunc, 0 );
  if(R!=EOK) {
    printf( "main: pthread_create() error" );
    return -1;  }
  sleep(1);
  return(0);
}


Результат:

ThreadFunc: start
(Policy==SCHED_FIFO)=1,(Policy==SCHED_RR)=0
(OldState==PTHREAD_CANCEL_ENABLE)=1
(OldState==PTHREAD_CANCEL_DISABLE)=0
(OldState==PTHREAD_CANCEL_ENABLE)=0
(OldState==PTHREAD_CANCEL_DISABLE)=1



Отсюда видно, что флаг PTHREAD_CANCEL_DISABLE в
Attr.flags ни на что не повлиял, а установка этого флага
для работающего потока функцией pthread_setcancelstate()
прошла нормально. Флаг PTHREAD_EXPLICIT_SCHED в
Attr.flags обрабатывается нормально - дисциплина
диспетчеризации стала SCHED_FIFO (а по умолчанию при
PTHREAD_INHERIT_SCHED она SCHED_RR).
Записан
Страниц: [1]
  Печать  
 
Перейти в: