Hi Vinit, So, does this function actually reentrant when free() has not been called?, thanks for your explanation. Randi On 12/25/09, vinit dhatrak <vinit.dhatrak@xxxxxxxxx> wrote: > Hi Randi, > > You are observing this because of malloc's behaviour. If you allocate > and free same-sized memory multiple times, then malloc tries to reuse > the memory. You can try this by putting malloc/free statements in a > loop. > > In your case, first thread gets created, it starts executing, it > allocates the memory, prints the address and frees it. After first > thread finishes its execution, second thread starts. It allocates the > memory so allocator reuses the same chunk and you get same address. > > If you put some sleep between malloc and free OR remove the free > statement itself as you did then you will get different addresses. So > this is really a timing issue when you do thread programming. > > Hope this helps you understand the issue. > > -Vinit > > On Fri, Dec 25, 2009 at 12:11 AM, Randi Botse <nightdecoder@xxxxxxxxx> > wrote: >> 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 >> -- >> To unsubscribe from this list: send the line "unsubscribe >> linux-c-programming" in >> the body of a message to majordomo@xxxxxxxxxxxxxxx >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> > -- To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html