Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can a pthread_mutex_t be moved in memory?

Tags:

mutex

realloc

I would like to build a dynamic malloced array of pthread_mutex that will grow over time (adding more mutexes). My question is whether they will still work if the array gets moved with realloc(). My concern is that pthread_mutex_init() might somehow set up internal information that depends on the address of the mutex at that moment.

To be more specific, here is a toy snippet that shows the issue:

pthread_mutex_t *my_mutexes = (pthread_mutex_t *) malloc (sizeof(pthread_mutex_t));
pthread_mutex_init (my_mutexes, NULL);
my_mutexes = (pthread_mutex_t *) realloc (my_mutexes, 2*sizeof(pthread_mutex_t));
/* does my_mutexes[0] still work at this point? */

I suppose the answer in all such cases is "if it's not expressly allowed, assume not" but I wanted to get the sage advice here. If the conclusion is not to do this, then I wonder how, in general, I might create a growing list of mutexes.

like image 660
pidloop Avatar asked Jan 30 '13 21:01

pidloop


1 Answers

It's not safe to move mutexes. Some mutex implementations on Linux, for example, use the futex system call which specifically waits on the address of the mutex.

If it needs to grow dynamically, I'd suggest using a master array of pthread_mutex_t pointers and a mutex for that master list. When you grow the array, you will just be moving the list of pointers rather than the mutexes themselves. The mutexes can be allocated with plain malloc.

like image 158
nneonneo Avatar answered Dec 10 '22 07:12

nneonneo