7

時間の経過とともに大きくなる (さらにミューテックスを追加する) 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? */

そのような場合の答えはすべて、「明示的に許可されていない場合は、許可されていないと仮定する」であると思いますが、ここで賢明なアドバイスを得たいと思いました. 結論がこれを行うことではない場合、一般に、増加するミューテックスのリストをどのように作成するのか疑問に思います。

4

1 に答える 1

6

ミューテックスを移動するのは安全ではありません。たとえば、Linux の一部のミューテックス実装では、futex特にミューテックスのアドレスを待機するシステム コールを使用します。

動的に拡張する必要がある場合は、pthread_mutex_tポインターのマスター配列とそのマスター リストのミューテックスを使用することをお勧めします。配列を拡張すると、ミューテックス自体ではなく、ポインターのリストを移動するだけになります。ミューテックスは、プレーンで割り当てることができますmalloc

于 2013-01-30T22:30:29.727 に答える