Thread struct as function parameter C
c, multithreading, struct
Solution
I recommend you to read http://www.advancedlinuxprogramming.com/alp-folder/alp-ch04-threads.pdf
And here what you wanted:
#define N 5
typedef struct thread {
pthread_t thread_id;
int thread_num;
// int thread_sum;
} ThreadData;
void *thread_start(void *thread)
{
ThreadData *my_data = (ThreadData*)thread;
//there is no guarantee that prints will be in order
// we will use its initial thread->num ,cause it differs for each thread
//plus you will see how threads will behave
int order=my_data->thread_num;
printf("%i) before num T: %i\n",order, my_data->thread_num);
my_data->thread_num=4;
printf("%i) after assignment num T: %i\n",order ,my_data->thread_num);
return NULL;
}
int main(int argc, char *argv[])
{
int i;
ThreadData thread[N];
for(i=0; i<N; i++)
{
thread[i].thread_num=i;
pthread_create(&(thread[i].thread_id), NULL, thread_start, (void *)(thread+i));
}
//wait for all threads
for (i = 0; i < N; i++)
pthread_join(thread[i].thread_id, NULL);
//print results of each thread
for (i = 0; i < N; i++)
printf(" %i)thread: number %i\n",i,thread[i].thread_num);
return 0;
}
Problem
I'm having a trouble passing a struct pointer into a function because I'm a bit confused with those pointers and references. I want to modify the `thread.thread_num` value from the `thread_start`function. ``` #include <stdio.h> #include <stdlib.h> //malloc, free #include <pthread.h> #define N 5 // void *malloc(size_t); struct thread { pthread_t thread_id; int thread_num; // int thread_sum; }; void *thread_start(void *thread) { struct thread *my_data; my_data = (struct thread *)thread; printf("num T: %i\n", my_data->thread_num); my_data->thread_num=4; printf("num T: %i\n", my_data->thread_num); return NULL; } int main(int argc, char *argv[]) { int i; struct thread pthread_data; struct thread *thread = &pthread_data; thread->thread_num=2; pthread_create(&thread->thread_id, NULL, thread_start, (void *)&thread); printf("num: %i\n",thread->thread_num); pthread_exit(NULL); return 0; } ``` But the value that print the main doesn't change (2). And then I want to create an array of thread struct, but I don't know how exactly do that: I guess it should be something like this: ``` int main(int argc, char *argv[]) { int i; struct thread pthread_data; struct thread *thread[N-1] = &pthread_data; // I don't know how to manage this. for(i=0; i<N; i++) { thread->thread_num=i; pthread_create(&thread[i]->thread_id, NULL, thread_start, (void *)&thread[i]); printf("num %i: %i\n",i,thread[i]->thread_num); } pthread_exit(NULL); return 0; } ``` Any thoughts?