Help! Posix Thread

Hi, i am writing this program to get myself started with posix thread.
I am expecting the program to output:
in main thread: i = 0
in child thread: i = 0 (maybe 1 here...the goal is to test shared variables in threads.)
However, the only output i see is
in main thread: i = 0

Why doesnt the child thread reach this if condition? if (pthread_equal(tid, mainThread) != 0)
How should i change the code to get the expected output?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void* thread(void* vargp);

int main(){
        int i = 0;
        pthread_t mainThread = pthread_self();
        pthread_t tid;
        pthread_create(&tid, NULL, thread, NULL);
        if (pthread_equal(tid, mainThread) != 0){
                printf("in child thread: i=%d\n", i);
                i++;
        }
        if (pthread_equal(tid, mainThread) == 0){
                printf("in main thread: i=%d\n", i);
                i++;
        }

        pthread_join(tid, NULL);
        exit(0);

}


void *thread(void* vargp){
        //i++;
        printf("Hello\n");
        return NULL;
}
Why doesnt the child thread reach this if condition? if (pthread_equal(tid, mainThread) != 0)
Why should it? The main thread just runs function thread then terminates.
pthread_create is not process fork.
The statement if (pthread_equal(tid, mainThread) != 0) never runs true anyway, You're checking to see if tid is equal to mainThread, but tid is a thread handle of your *thread function not the main thread, so it will never not be equal to 0 because pthread_equal(tid, mainThread) will always return false. That's why it does print in main thread: i = 0. You could change it so that the *thread function itself prints the value of i and make i's scope global; BUT that isn't thread safe and to make it thread safe you're going to have to use mutex's.
Last edited on
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void* thread(void* vargp);
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
        int i = 0;

int main(){
        pthread_t tid;
        pthread_create(&tid, NULL, thread, NULL);
		pthread_mutex_lock(&mutex);		
			i++;
		pthread_mutex_unlock(&mutex);
                printf("in main thread: i=%d\n", i);
        pthread_join(tid, NULL);
        exit(0);

}


void *thread(void* vargp){
        pthread_mutex_lock(&mutex);		
		i++;
	pthread_mutex_unlock(&mutex);
        printf("In Child thread i=%d\n",i);
        return NULL;
}

This should be thread safe and achieve what I think you were going for.
Last edited on
Topic archived. No new replies allowed.