HELP: Threads: strange behaiviour (???)

Alex kbyte at iol.pt
Wed Aug 25 22:36:03 UTC 2004


Hi, 

I have a rtems program that launchs 2 extra threads. Each thread shares the same execution function.
Each thread, main included, uses the SCHED_RR with poriority 1.
The objective is to run the threads at the same time as possible sharing the time slice. In other words, I 
want to execute each thread in each quantum, so I choosed the SCHED_RR.

What I get is the first extra thread running till the end and then the second extra thread begins execution.
Why both extra threads didn't start execution "at the same time?"

The output I get is:

...
WAITING FOR SECONDARY THREADS

secondary thread: beginning

"some moments after..."

secondary thread: finishing

secondary thread: beginning

"some moments after..."

secondary thread: finishing
...



The output I expected was:

...
secondary thread: beginning
secondary thread: beginning

"some moments after..."

secondary thread: finishing
secondary thread: finishing
...

Do you agree with me?



This is source code:

#define CONFIGURE_INIT
#include <rtems.h>
#include <signal.h>
#include <rtems/posix/timer.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <rtems/error.h>
#include <bsp.h>
#include <pthread.h>
#ifndef _POSIX_THREADS
	#error "rtems is supposed to have pthreads"
#endif

#include <assert.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <time.h>
#include <sched.h>


void *Task_1(void *argument)
{
  int i=0;
  int status;
  struct timespec current;

  puts("\nSecondary Thread: beginning" );
  for (i=0;i<100000000;i++)
  {
    status += clock_gettime( CLOCK_REALTIME, &current );
  }

  puts("\nSecondary Thread: finishing" );
  pthread_exit( NULL );
  return NULL;
}


#define CONFIGURE_INIT_TASK_ENTRY_POINT   POSIX_Init
void POSIX_Init(void* args)
{
  const int MAX_THREADS 	=10;
  const int n_number_of_counts 	=10;   

  int 			i=0;
  pthread_t        	Task_ids[MAX_THREADS];
  pthread_t        	Init_id;
  int              	status;
  pthread_attr_t   	attr1;
  pthread_attr_t   	attr2;
  struct sched_param  	param;
  

  puts("\n\nSTARTING THE MAIN PROGRAM");
  Init_id = pthread_self();
  param.sched_priority = 1;
  status = pthread_setschedparam(Init_id, SCHED_RR, &param);

  puts("\nCREATING THE SECONDARY THREADS");
  
  status = pthread_attr_init(&attr1); 
  if(status!=0)
  {
    puts("\n Error in pthread_attr_init1()");
    exit(1);
  }
  attr1.schedpolicy = SCHED_RR;
  attr1.schedparam.sched_priority = 1;

  status = pthread_attr_init(&attr2); 
  if(status!=0)
  {
    puts("\n Error in pthread_attr_init1()");
    exit(1);
  }
  attr2.schedpolicy = SCHED_RR;
  attr2.schedparam.sched_priority = 1;


  status = pthread_create(&(Task_ids[0]),&attr1,Task_1,NULL);
  if(status!=0)
  {
    puts("\n Error in pthread_create1()");
    exit(1);
  }

  status = pthread_create(&(Task_ids[1]),&attr2,Task_1,NULL);
  if(status!=0)
  {
    puts("\n Error in pthread_create2()");
    exit(1);
  }

  puts("\nAFTER THREADS CREATION...\n"); 
  
  puts( "\nWAITING FOR SECONDARY THREADS..." );
  status = pthread_join( Task_ids[0], NULL );
  if(status!=0)
  {
    puts("\n Error in pthread_join0()");
    exit(1);
  }

  status = pthread_join( Task_ids[1], NULL );
  if(status!=0)
  {
    puts("\n Error in pthread_join1()");
    exit(1);
  }

  puts("\nEND OF PROGRAM ***");
  exit(1);
}


#define CONFIGURE_MICROSECONDS_PER_TICK 1000  /*one milisecond per tick*/
#define CONFIGURE_TICKS_PER_TIMESLICE   1     /*each time slice runs for one milisecond*/
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
#define CONFIGURE_POSIX_INIT_THREAD_TABLE
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
#define CONFIGURE_MAXIMUM_TASKS             	 20
#define CONFIGURE_MAXIMUM_POSIX_THREADS     	 20
#define CONFIGURE_MAXIMUM_SEMAPHORES        	 20
#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES    	 20
#define CONFIGURE_MAXIMUM_POSIX_TIMERS 		 20
#define CONFIGURE_MAXIMUM_TIMERS 		 20
#define CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS 	 20
#define CONFIGURE_EXTRA_TASK_STACKS  		 (3 * RTEMS_MINIMUM_STACK_SIZE)
#include <confdefs.h>





________________________________________________________________________________
Não recebe as fotografias que lhe tentam enviar? A sua caixa de correio é muito pequena?
Com o Correio IOL pode enviar e receber ficheiros com 7MB.
Crie já a sua nova conta de e-mail: http://www.iol.pt/rodape_correio1




More information about the users mailing list