Re: thread: reentrant question

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]


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]

Add to Google Powered by Linux