Thread: pthreads, I created the thread, passed a function, function never runs.

  1. #1
    Registered User
    Join Date
    Sep 2008
    Posts
    47

    Question pthreads, I created the thread, passed a function, function never runs.

    Hi guys.

    So basically my program is doing the following:
    The parent: recver process is going to spawn 1 thread to read a file the child process is sending. The child process is writing a file to a message queue (IPC) and the parent process is spawning a thread and reading the message queue and will then also write the new file.
    Before I tried to throw threads in this program, it was working fine with just 2 processes, 1 process writing to the message queue the other process reading and wrtiing a new file. So the message queue system isn't the issue it is the threading issue.

    Code:
    /* Functions */
    int main( int argc, char **argv ) 
    {
        int pid;
        int read_index = 0, write_index = 0, new_index = 0;
        int err;
        FILE *fp;
    
        /* Check for arguments */
        if ( argc < 3 ) 
        {
            /* Complain, explain, and exit */
            fprintf( stderr, "missing or bad command line arguments\n" );
            fprintf( stderr, CLIENT_USAGE );
            exit( -1 );
        }
    
        /* get the index for the IPC object */
        err = create_ipc( &read_index, &write_index );
        if ( err ) {
          fprintf( stderr, "create ipc error\n" );
          exit(-1);
        }
    
        /* create receiver process */
        if (( pid = fork() != 0 )) {
          /* parent: recver */
    
          /* setup the IPC channel */
          err = setup_ipc_parent( read_index, write_index,  &new_index );
          if ( err ) {
            fprintf( stderr, "rcver: error in ipc setup\n" );
    	exit(-1);
          }
    
          
          
          /* open the output file and return the file descriptor */
          if (( fp = fopen( argv[2], "w+" )) < 0 ) {
    	fprintf( stderr, "rcver: file open failure\n" );
    	return -1;
          }
    
          /* create threads to receive the file contents */
          run_pool_threads( fp, new_index, rcv_file );
          //fclose( fp );
    
          /* dump the file contents */
          //rcv_file( argv[2], new_index );
          fprintf( stderr, "rcver: finished\n" );
        }
        else {
          /* childd */
    
          /* setup the IPC channel */
          err = setup_ipc_child( read_index, write_index, &new_index );
          if ( err ) {
            fprintf( stderr, "sender: error in ipc setup\n" );
    	exit(-1);
          }
    
    
    
    	//added
           /* open the input file and return the file descriptor */
          if (( fp = fopen( argv[1], "r" )) < 0 ) {
    	fprintf( stderr, "sender: file open failure\n" );
    	return -1;
          }
          
    	
          /* send the file contents */
          //send_file( argv[1], new_index );
          send_file(fp,new_index);
    
          fprintf( stderr, "sender: finished\n" );
          }
    
        exit( 0 );
    }

    Here is the code that creates the thread, notice I'm using a structure becuase I need to pass in 2 parameters to the processes, a file descriptor and a file pointer.
    Code:
    int run_pool_threads( FILE *fp, int fd, void *(*threadfn)(void *))
    {
      /* build, run, and manage all the sorting threads -- run rcv_file for each */
      //for now there will be only 1 thread.
      
      pthread_t thread_id;
      
       
       //We must create a structure to pass multiple arguments to the thread, such as fp and index
        thread_work_t * work_t = malloc(sizeof(thread_work_t));
         work_t->fp = fp;
         work_t->fd = fd;
      
          //creating the new thread and passing the thread_work_t structure
          pthread_create( &thread_id, NULL, threadfn, work_t);
       
     
    
      return 0;
    }

    Here is the function I'm passing to the thread, I don't beleive this ever gets ran because when I look at the output it never prints "Thread number: ". And the parent process just ends.

    Code:
    void *rcv_file( void *arg )
    {
      printf("Thread number %ld\n", pthread_self());
      //you must cast the arg to the correct data type to access its data members
      thread_work_t *work_t;
      work_t = (struct thread_work *) arg;
    
      
     //create a struct to hold the msg type and message
     struct msgbuf_t msg;
     int cmd = IPC_STAT;
     
    int rtrn = msgctl(work_t->fd, cmd, &BUFF);
    if (rtrn == -1) 
      {
        perror("msgctl: msgctl failed");
        return EXIT_FAILURE;
      }
    
      printf("msg_qnum: %d\n",BUFF.msg_qnum);
    
    
    
      for(;;) 
      { 
    
    	if(BUFF.msg_qnum == 0)  //there is no messages to read! so wait.
    	{
    	     sched_yield();
    	}
    	    
            //if (msgrcv(index, &msg, MSGBUF_SIZE, 0, 0) == -1) {
    	if (msgrcv(work_t->fd, &msg, MSGBUF_SIZE, 0, 0) == -1) {
                perror("msgrcv");
                exit(1);
            }
    	
    	
    	if(msg.type == MEND)
    	{
    	    printf("Got MEND from sender, exit\n");
    	  //  fclose(fp);
    	    fclose(work_t->fp);
    	    break;
    	}
    	else if(msg.type == MTYPE)
    	{
    	    printf("rev: %s", msg.text);
    	    //fprintf(fp,"%s",msg.text);
    	    fprintf(work_t->fp,"%s",msg.text);
    	     
    	}
    	else
    	{
    	    printf("WE GOT SOMTHING ELSE! LOL\n");
    	}
    	     
      }
    
         return 0;


    HEre is the output:
    Code:
    #
    cory@ubuntu:~/Documents/Operating Systems/p2$ ./p2 test2/ltest ltestOUT
    KEY generated: 1090584577                                              
    read and write id's: 32769                                            
    sent: 3 help me, mr wizard!                                            
    sent: 7 help me, mr wizard!                                            
    sent: 6 help me, mr dude!                                              
    sent: Found EOF
    sender: finished
    rcver: finished

    As you can see its sending fine, but it never reads from the message queue, the thread I don't believe is ever getting ran and Im' not sure why.

    ANy help would be great!

  2. #2
    Registered User Codeplug's Avatar
    Join Date
    Mar 2003
    Posts
    4,981
    Right after calling run_pool_threads(), exit() is called - bringing the down the process and all it's threads.

    You need to to either join with the thread returned by pthread_create(), or create the thread detached, then call pthread_exit() instead of exit() in main().

    gg

  3. #3
    Registered User
    Join Date
    Sep 2008
    Posts
    47
    Thanks a lot Codeplug, worked!

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Compiling sample DarkGDK Program
    By Phyxashun in forum Game Programming
    Replies: 6
    Last Post: 01-27-2009, 03:07 AM
  2. dllimport function not allowed
    By steve1_rm in forum C++ Programming
    Replies: 5
    Last Post: 03-11-2008, 03:33 AM
  3. We Got _DEBUG Errors
    By Tonto in forum Windows Programming
    Replies: 5
    Last Post: 12-22-2006, 05:45 PM
  4. I need help with passing pointers in function calls
    By vien_mti in forum C Programming
    Replies: 3
    Last Post: 04-24-2002, 10:00 AM
  5. qt help
    By Unregistered in forum Linux Programming
    Replies: 1
    Last Post: 04-20-2002, 09:51 AM