Help: Threading App... Is this strange behaiviour???

Alex kbyte at iol.pt
Mon Aug 9 21:03:08 UTC 2004


Hi all,
I am beginning to write rtems threading apps. I first wrote a very simple app just to test the waiting for the child thread. See code below.
When I execute the app I see the screen output two times (replicated)!
I cant see why it is happening... Can you help me?


The output I get when I run the code below in a intel 686, rtems 4.6 is the following:

STARTING THE MAIN THREAD
Creating a secondary thread of SCHED_RR with priority 1
Main Thread: Waitting for the second thread to finish
Secondary Thread: begining
   -> “The execution pauses a little at this point, due to the thread cicle
Secondary Thread: Finishing
*** END OF PROGRAM ***

STARTING THE MAIN THREAD
Creating a secondary thread of SCHED_RR with priority 1
Main Thread: Waitting for the second thread to finish
Secondary Thread: begining
   -> “The execution pauses a little at this point, due to the thread cicle
Secondary Thread: Finishing
*** END OF PROGRAM ***

Why the output appears two times?



#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)
{
  pthread_t        Task_id;
  pthread_t        Init_id;
  int              status;
  pthread_attr_t   attr;
  struct sched_param  param;


  puts( "\n\n STARTING THE MAIN THREAD" );
  /* get id of this thread */
  Init_id = pthread_self();
  /*SET MAIN THREAD SCHEDULER*/
  param.sched_priority = 1;
  status = pthread_setschedparam( Init_id, SCHED_RR, &param );


  /* Create a second thread as SCHED_RR */
  puts( "\nCreating a secondary thread of SCHED_RR with priority 1" );
  status = pthread_attr_init( &attr );
  attr.schedpolicy = SCHED_RR;
  attr.schedparam.sched_priority = 1;
  status = pthread_create( &Task_id, &attr, Task_1, NULL );

  puts( "\nMain Thread: Waitting for the second thread to finish" );
  status = pthread_join( Task_id, NULL );

  puts( "*** END OF PROGRAM ***" );
}



#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>



___________________________________________________________________________________________
Sabia que o e-mail do IOL é o e-mail nacional mais usado pelos Portugueses?
Estudo realizado pela Multidados, Empresa de consultoria e tratamento estatístico de dados.
http://www.multidados.com/




More information about the users mailing list