Click here to Skip to main content
       

C / C++ / MFC

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
Question[Solved] Memory leak in producer-consumer program [modified]membernoislude25 Feb '13 - 7:30 
Hi all. Nice to meet you. Could you tell me how can I fix the memory leak of this code? I don't have a clue. Thanks.
 
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>

 
#define MAX 100
#define BUFSZ 10
 
int i;
int buffindex = 0;
char* buffer;
 
void* producer(void* p);
void* consumer(void* p);
 
pthread_cond_t cond_prod = PTHREAD_COND_INITIALIZER;
pthread_cond_t cond_con = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
 
int main(void)
{
    pthread_t prod, con;
    
    if((buffer = malloc(sizeof(char) * BUFSZ)) == NULL)        
    {     
       perror("malloc");
       exit(EXIT_FAILURE);
    }
    
    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&cond_prod, NULL);
    pthread_cond_init(&cond_con, NULL);
    pthread_create(&prod, NULL , producer, NULL);
    pthread_create(&con,  NULL , consumer, NULL);
    pthread_join(prod, NULL);
    pthread_join(con,  NULL);
    pthread_cond_destroy(&cond_prod);
    pthread_cond_destroy(&cond_con);
    pthread_mutex_destroy(&mutex);
    free(buffer);
    return EXIT_SUCCESS;
}
 
void* producer(void* p)
{
    for(i = 0; i < MAX; i++)
    {
       pthread_mutex_lock(&mutex); 
       if(buffindex == BUFSZ)
       {
          pthread_cond_wait(&cond_prod, &mutex); /* down */
       }    
       buffer[buffindex++] = '@';
       printf("Produce: %d\n", buffindex);
       pthread_cond_signal(&cond_con); /* up */
       pthread_mutex_unlock(&mutex);
    }    
    pthread_exit(EXIT_SUCCESS);
    return NULL;
}
 
void* consumer(void* p)
{
   for(i = 0; i < MAX; i++) 
   {
      pthread_mutex_lock(&mutex);
      if(buffindex == -1)
      {
         pthread_cond_wait(&cond_con, &mutex); /* down */
      }     
      printf("Consume: %d\n", buffindex--);
      buffer[buffindex] = '\0';
      pthread_cond_signal(&cond_prod); /* up */ 
      pthread_mutex_unlock(&mutex);
   }    
   pthread_exit(EXIT_SUCCESS);
   return NULL;
}


modified 27 Feb '13 - 15:48.

AnswerRe: Memory leak in producer-consumer program PinmemberRichard Andrew x6425 Feb '13 - 10:08 
This is a good example of how NOT to ask a question on Code Project.
 
You're just dumping a bunch of code and asking others to do your work.
 
What have you tried? Have you run this code in the debugger? Exactly which allocation is leaking?
 
No wonder you don't have a clue!

 

The difficult we do right away...
...the impossible takes slightly longer.

GeneralRe: Memory leak in producer-consumer program Pinmembernoislude25 Feb '13 - 10:23 
Thank you for the greetings sir. First of all, I'd like to say that I'm a self taught person so... this thing of "do you think we are really going to do your homework for you?!" doesn't exist for me (did you know there are freaking bad colleges in the world?). Ah... I study in a college but the place where I study simply sucks (all my teachers try to hide the C implementation of the theory from us as much as they can and I mean ... always!). So, I decided to learn everything (as much as possible) from Computer Science by myself. So, please, take easy. I don't have a clue because I don't have anyone to teach me anything Smile | :) .
 
Back to the code ...
 
sorry if I didn't post the output:
 
Produce: 1
Produce: 2
Consume: 2
Consume: 1
Consume: 0
==2737== Thread 3:
==2737== Invalid write of size 1
==2737==    at 0x400D6C: consumer (prodcon.c:72)
==2737==    by 0x4E38E0D: start_thread (in /lib64/libpthread-2.15.so)
==2737==  Address 0x53f203f is 1 bytes before a block of size 10 alloc'd
==2737==    at 0x4C2ABED: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==2737==    by 0x400B6D: main (prodcon.c:24)
 
==2737== LEAK SUMMARY:
==2737==    definitely lost: 0 bytes in 0 blocks
==2737==    indirectly lost: 0 bytes in 0 blocks
==2737==      possibly lost: 0 bytes in 0 blocks
==2737==    still reachable: 1,552 bytes in 4 blocks
==2737==         suppressed: 0 bytes in 0 blocks
 
I appreciate the help.
GeneralRe: Memory leak in producer-consumer program PinmemberRichard Andrew x6425 Feb '13 - 10:33 
I apologize for not understanding your situation better, but you didn't make it clear in your first post. Blush | :O

 

The difficult we do right away...
...the impossible takes slightly longer.

GeneralRe: Memory leak in producer-consumer program Pinmembernoislude25 Feb '13 - 10:42 
Quote:
I apologize for not understanding your situation better

 
ok, no problem Smile | :)
 
Quote:
but you didn't make it clear in your first post.

 
sorry for that too. Blush | :O
QuestionRe: Memory leak in producer-consumer program PinmemberDavidCrow25 Feb '13 - 13:28 
noislude wrote:
==2737== at 0x400D6C: consumer (prodcon.c:72)
...
==2737== by 0x400B6D: main (prodcon.c:24)
Are these line numbers?

"One man's wage rise is another man's price increase." - Harold Wilson

"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons

"Show me a community that obeys the Ten Commandments and I'll show you a less crowded prison system." - Anonymous


AnswerRe: Memory leak in producer-consumer program Pinmembernoislude25 Feb '13 - 13:33 
yes. David you don't need to bother with this program. few hours ago, I took a detour from Modern Operating Systems to Programming with POSIX Threads to get a better understanding about threads. I apologize for the trouble.
GeneralRe: Memory leak in producer-consumer program PinmemberStefan_Lang26 Feb '13 - 3:29 
The error output points at the function consumer, and the program output indicates the state before hitting the error: You're writing to an array index of -1 in this line:
      buffer[buffindex] = '\0';
, after decreasing buffindex from 0 to -1 in this line:
      printf("Consume: %d\n", buffindex--);
Suggested fix: change
      if(buffindex == -1)
to
      if(buffindex == 0)
, or better yet:
      if(buffindex <= 0)
(in case you accidentally decrease buffindex multiple times; your current code doesn't seem to be able to achieve that, but code changes...)
 
The leak information may go away after fixing the error, it may just be a consequence of the abnormal error condition. if not, please come back with your new results.
GeneralRe: Memory leak in producer-consumer program Pinmembernoislude26 Feb '13 - 8:07 
I fixed the problem with the buffer index. Now I can notice three behaviors:
 
the first one, always producing one stuff and consuming it (in this case, I get a memory leak)
 
Produce: 1
Consume: 1
Produce: 1
Consume: 1
Produce: 1
Consume: 1
Produce: 1
Consume: 1
Produce: 1
Consume: 1
Produce: 1
Consume: 1
Produce: 1
Consume: 1
Produce: 1
Consume: 1
 
possibly lost: 272 bytes in 1 blocks
 
for the second behavior, I produced and consumed ten stuffs (and I got a bigger memory leak)
 
Produce: 1
Produce: 2
Produce: 3
Produce: 4
Produce: 5
Produce: 6
Produce: 7
Produce: 8
Produce: 9
Produce: 10
Consume: 10
Consume: 9
Consume: 8
Consume: 7
Consume: 6
Consume: 5
Consume: 4
Consume: 3
Consume: 2
Consume: 1
Produce: 1
 
still reachable: 1,552 bytes in 4 blocks
 
for the last behavior, everything went fine (without memory leaks)
 
Produce: 1
Produce: 2
Produce: 3
Produce: 4
Produce: 5
Produce: 6
Produce: 7
Produce: 8
Produce: 9
Produce: 10
Consume: 10
Consume: 9
Consume: 8
Consume: 7
Consume: 6
Consume: 5
Consume: 4
Consume: 3
Consume: 2
Consume: 1
Produce: 1
 
All heap blocks were freed -- no leaks are possible

GeneralRe: Memory leak in producer-consumer program PinmemberStefan_Lang26 Feb '13 - 22:21 
I don't really see how your code can leak more than one block of memory when the entire program only allocates one!? Those leaks must be elsewhere - if those leak messages are indeed correct.
 
I suspect that the pthread library internally uses some kind of memory pool that doesn't get freed before the end of the program. I've seen the same thing in a CAD library that produces tens of thousands of "leak" messages because of that. It's very annoying becasue that way it's extremely difficult to pinpoint actual leaks, or find out if there even is one. :(
GeneralRe: Memory leak in producer-consumer program Pinmembernoislude26 Feb '13 - 22:27 
I see. Are those internal leaks a bad thing for a bigger program?
GeneralRe: Memory leak in producer-consumer program PinmemberStefan_Lang26 Feb '13 - 23:01 
Well, if my assumption is correct, technically these aren't leaks - they just appear as such because memory pools are designed that way. If used correctly, these 'leaks' will not be a problem, except when it comes to the problem of locating real leaks.
 
Memory pools are used as a faster way to allocate and free lots of small blocks of memory. Basically they take up the role of a memory manager for specific types (or sizes) of objects. They may be capable of freeing unused blocks at runtime (reducing the number of "leak" messages), but doing so complicates the management effort considerably. As a consequence, most implementations never free blocks at runtime, they only grow when running out of free memory within already allocated blocks. That means the total cost of memory is the maximum load at runtime.
SuggestionRe: Memory leak in producer-consumer program Pinmembernoislude27 Feb '13 - 9:47 
Just in case someone wonders, it was written in the book Programming with POSIX threads (the book I mentioned earlier), that we don't need to destroy (with pthread_mutex_destroy()) a mutex initialized statically i.e. with PTHREAD_MUTEX_INITIALIZER. Thank you people for all the attention given to this topic Smile | :)
AnswerRe: Memory leak in producer-consumer program PinmemberVaclav_Sal25 Feb '13 - 17:45 
I did follow this discussion which started badly – no real info was provided on the initial post, almost got into personal fist fight - “nobody spoon-fed me knowledge about   programming” and ended up with no real solution to learn from.
I often wonder why people waste their time posting stuff like this.
… off my soapbox now...

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   


Advertise | Privacy | Mobile
Web03 | 2.6.130523.1 | Last Updated 26 May 2013
Copyright © CodeProject, 1999-2013
All Rights Reserved. Terms of Use
Layout: fixed | fluid