7

我想构建一个动态分配的 pthread_mutex 数组,该数组会随着时间的推移而增长(添加更多互斥体)。我的问题是,如果使用 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? */

我想在所有这些情况下的答案都是“如果没有明确允许,就假设不是”,但我想在这里得到明智的建议。如果结论不是这样做,那么我想知道一般来说,我如何创建一个不断增长的互斥体列表。

4

1 回答 1

6

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

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

于 2013-01-30T22:30:29.727 回答