#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <assert.h> /* Delete memory that has a held lock and see what happens. */ typedef struct { int stuff[2000]; pthread_mutex_t lock; int morestuff[2000]; } XX; void bar ( void ); void foo ( void ); int main ( void ) { XX* xx = malloc(sizeof(XX)); assert(xx); pthread_mutex_init( &xx->lock, NULL ); pthread_mutex_lock( &xx->lock ); free(xx); bar(); foo(); bar(); return 0; } /* Try the same, on the stack */ void bar ( void ) { pthread_mutex_t mx = PTHREAD_MUTEX_INITIALIZER; // pthread_mutex_init( &mx, NULL ); pthread_mutex_lock( &mx ); /* now just abandon mx */ } /* and again ... */ void foo ( void ) { pthread_mutex_t mx; pthread_mutex_init( &mx, NULL ); pthread_mutex_lock( &mx ); /* now just abandon mx */ }