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
[Linux Assembler]
[Git]
[Kernel List]
[Fedora Development]
[Fedora Announce]
[Autoconf]
[Yosemite Campsites]
[Yosemite News]
[GCC Help]