pthread_mutex_t可以在内存中移动吗?

use*_*078 6 mutex realloc

我想构建一个pthread_mutex的动态malloced数组,它将随着时间的推移而增长(添加更多互斥锁).我的问题是,如果使用realloc()移动数组,它们是否仍然可以工作.我担心的是pthread_mutex_init()可能会以某种方式设置内部信息,这些信息取决于当时互斥的地址.

更具体地说,这是一个显示问题的玩具片段:

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? */
Run Code Online (Sandbox Code Playgroud)

我想在所有这些情况下的答案是"如果没有明确允许,假设不是",但我想在这里得到圣人的建议.如果结论不是这样做,那么我想知道,一般来说,我可能会创建一个不断增长的互斥体列表.

nne*_*neo 6

移动互斥锁是不安全的.例如,Linux上的某些互斥锁实现使用futex系统调用,该调用专门等待互斥锁的地址.

如果它需要动态增长,我建议使用pthread_mutex_t指针的主数组和该主列表的互斥锁.当您增长数组时,您将只移动指针列表而不是互斥锁本身.可以使用plain分配互斥锁malloc.