From: Randi Botse <nightdecoder@gmail.com>
To: vinit dhatrak <vinit.dhatrak@gmail.com>
Cc: linux-c-programming@vger.kernel.org
Subject: Re: thread: reentrant question
Date: Sat, 26 Dec 2009 12:32:01 +0700 [thread overview]
Message-ID: <34e1241d0912252132y48945feek8c803ccb8625cbbc@mail.gmail.com> (raw)
In-Reply-To: <edf0f34e0912241130y20f6a9daj7085e57ee498e211@mail.gmail.com>
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@gmail.com> 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@gmail.com>
> 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@vger.kernel.org
>> 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@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2009-12-26 5:32 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-12-24 18:41 thread: reentrant question Randi Botse
2009-12-24 19:30 ` vinit dhatrak
2009-12-26 5:32 ` Randi Botse [this message]
2009-12-26 10:42 ` Michał Nazarewicz
2009-12-26 21:23 ` vinit dhatrak
2009-12-27 13:12 ` Randi Botse
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=34e1241d0912252132y48945feek8c803ccb8625cbbc@mail.gmail.com \
--to=nightdecoder@gmail.com \
--cc=linux-c-programming@vger.kernel.org \
--cc=vinit.dhatrak@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).