APUEを読んでいて、第11章のスレッド同期と混同しています。以下はコードスニペットです。
#define NHASH 29
#define HASH(fp) (((unsigned long)fp)%NHASH)
struct foo *fh[NHASH];
pthread_mutex_t hashlock = PTHREAD_MUTEX_INITIALIZER;
struct foo {
int f_count;
pthread_mutex_t f_lock;
struct foo *f_next; /* protected by hashlock */
int f_id;
/* ... more stuff here ... */
};
struct foo *
foo_alloc(void) /* allocate the object */
{
struct foo *fp;
int idx;
if ((fp = malloc(sizeof(struct foo))) != NULL) {
fp->f_count = 1;
if (pthread_mutex_init(&fp->f_lock, NULL) != 0) {
free(fp);
return(NULL);
}
idx = HASH(fp);
pthread_mutex_lock(&hashlock);
fp->f_next = fh[idx];
fh[idx] = fp;
pthread_mutex_lock(&fp->f_lock);
pthread_mutex_unlock(&hashlock);
/* ... continue initialization ... */
pthread_mutex_unlock(&fp->f_lock);
}
return(fp);
}
私の疑問は次のとおりです。
なぜ
pthread_mutex_lock(&fp->f_lock)
前に置くのpthread_mutex_unlock(&hashlock)
ですか?代わりに後で配置できますか?fp
ローカル変数なので、一緒pthread_mutex_lock(&fp->f_lock)
にpthread_mutex_unlock(&fp->f_lock)
削除できますか?