Passing arguments to thread in C


by James889
Tags: arguments, passing
James889
James889 is offline
#1
Jul28-11, 09:38 AM
P: 184
Hi,

I am trying to figure out how to pass arguments to a thread via a struct.
It's not really working out for me.

What am i doing wrong here?
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>


void *run(void *thread_arg);

struct thread_args {
  
      int arraylength;
      int *ptr;
      char *name;
};
        
int main() {
        
  pthread_t thread_id;
  struct thread_args *thread_data;
 

  int array[10] = { 1,2,3,4,5,6,7,8,9,10 };
  
  
  thread_data->arraylength = 10;
  thread_data->ptr = &array[0];
 
  strcpy(thread_data->name,"David"); /* Is this correct ? */
  printf("%s",thread_data->name); //This prints nothing

  
  pthread_create(&thread_id,NULL,run,(void *)&thread_data);
  pthread_join(thread_id,NULL);
  return 0;
  }    
       

 void *run(void *thread_arg) {
        printf("hi");
        struct thread_args *my_data;
        my_data = (struct thread_args *)thread_arg;
        printf("%s",my_data->name);
         
         
  }
Phys.Org News Partner Science news on Phys.org
Review: With Galaxy S5, Samsung proves less can be more
Making graphene in your kitchen
Study casts doubt on climate benefit of biofuels from corn residue
rcgldr
rcgldr is offline
#2
Jul28-11, 09:41 AM
HW Helper
P: 6,925
You declared an instance of a pointer to struct thread_data, but you never declared or allocated an instance of struct thread_data. Looking at your code I think you just need to remove the pointer reference:

    struct thread_args thread_data;
    ...  
    thread_data.arraylength = 10;
    thread_data.ptr = &array[0];
or if you want to use a pointer

    struct thread_args thread_data;
    struct thread_args *pthread_data = &thread_data;
    
    ...  
    pthread_data->arraylength = 10;
    pthread_data->ptr = &array[0];
    ...
    pthread_create(&thread_id,NULL,run,(void *)pthread_data);
James889
James889 is offline
#3
Jul28-11, 10:01 AM
P: 184
Oops, stupid mistake

But why is there no output from the thread routine?

It is supposed to print the name "David"

chiro
chiro is offline
#4
Jul29-11, 01:05 AM
P: 4,570

Passing arguments to thread in C


Quote Quote by James889 View Post
Oops, stupid mistake

But why is there no output from the thread routine?

It is supposed to print the name "David"
I'm not familiar with the syntax of p_threads, but if you passed a bad pointer as a result of your (thread_data) variable, then the thread has most likely not been created at the very least due to a pointer problem and the thread won't have been allocated, let alone run.

Assuming there are no problems in this regard (and the program didn't crash), then the only thing I could think of is that you didn't make the right call or pass the right argument for the thread to automatically start.

To be honest though, I'm surprised you didn't get any crashes due to your bad code that doesn't even instantiate or allocate the data for the struct you are using.
I like Serena
I like Serena is online now
#5
Jul29-11, 01:16 AM
HW Helper
I like Serena's Avatar
P: 6,189
This looks like homework.
Is it?
rcgldr
rcgldr is offline
#6
Jul29-11, 01:46 AM
HW Helper
P: 6,925
Quote Quote by James889 View Post
But why is there no output from the thread routine?
Because you added yet another level of indirection in the function call. Thread_data pointer was allocated on the stack, but probably not initialized or initialized to zero, so you just stored the strings into some random location in memory or location zero. Then you called the function with &thread_data, which is the address within the stack for the thread_data pointer.
James889
James889 is offline
#7
Jul29-11, 02:46 PM
P: 184
Quote Quote by I like Serena View Post
This looks like homework.
Is it?
No, it's not. It's home work, play for fun :)


Register to reply

Related Discussions
Help with arguments in Java Programming & Computer Science 35
Passing Strings as Arguments to Functions in C Programming & Computer Science 5
Arguments Against Superdeterminism General Discussion 142
Arguments against LQG Beyond the Standard Model 24
Geometric arguments General Math 5