thread: reentrant question

Randi Botse <[email protected]>
Newsgroups org.kernel.vger.linux-c-programming
Message-ID <[email protected]>
Hi all,

I'm now learning thread reentrancy on Linux, so i write simple codes
for demonstration:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *func(void *data)
{
    char *ptr;

    ptr = malloc(8);
    printf("thread%i -> ptr at: %p\n", *(int*) data, ptr);
    free(ptr);
    return NULL;
}

#define NTHREAD 5

int main(void)
{
    pthread_t thread[NTHREAD];
    int i;

    for (i = 0; i < NTHREAD; i++)
        if (pthread_create(&thread[i], NULL, func, (void*) &i))
            return -1;
    for (i = 0; i < NTHREAD; i++)
        pthread_join(thread[i], NULL);
    return 0;
}


I know the func() function is not reentrant, worst printf() debugging
told me that's each thread pointer to character (ptr) may has same
address, like this output:

thread1 -> ptr at: 0x9a80128
thread1 -> ptr at: 0x9a80138
thread2 -> ptr at: 0x9a801d8
thread4 -> ptr at: 0x9a801d8
thread4 -> ptr at: 0x9a801d8

I try to modify the func() by not free ptr to be:

void *func(void *data)
{
    char *ptr;

    ptr = malloc(8);
    printf("thread%i -> ptr at: %p\n", *(int*) data, ptr);
    /* free(ptr); */
    return NULL;
}

And the result is i always got different address of each thread's ptr, such as:

thread0 -> ptr at: 0x8db2098
thread1 -> ptr at: 0x8db2138
thread2 -> ptr at: 0x8db21d8
thread3 -> ptr at: 0x8db2278
thread4 -> ptr at: 0x8db2318

Can you explain me why this happen? how about my printf() debugging
method? it's works for this demonstration?
Thanks before.

              - Randi
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.