Chciałem się zapytać o pewien fragment kodu z książki https://www.amazon.com/Advanced-Programming-UNIX-Environment-3rd/dp/0321637739. Mianowicie chodzi o alokację struktury/obiektu na stercie, który będzie współdzielony między wątkami.
Fragment kodu z książki:
#define NHASH 29
#define HASH(id) (((unsigned long)id)%NHASH)
struct foo *fh[NHASH];
pthread_mutex_t hashlock = PTHREAD_MUTEX_INITLIALIZER;
struct foo {
int f_count;
pthread_mutex_t f_lock;
int f_id;
struct foo *f_next; /* protected by hashlock */
};
struct foo *foo_alloc(int id) {
struct foo *fp;
int idx;
if ((fp = malloc(sizeof(struct foo))) != NULL) {
fp->f_count = 1;
fp->f_id = id;
if (pthread_mutex_init(&fp->f_lock, NULL) != 0) {
free(fp);
return(NULL);
}
idx = HASH(id);
pthread_mutex_lock(&hashlock);
fp->f_next = fh[idx];
fh[idx] = fp;
pthread_mutex_lock(&fp->f_lock);
pthread_mutex_unlock(&haslock);
/* continue initialization */
pthread_mutex_unlock(&fp->f_lock);
}
return(fp);
} /* allocate the object */
Fragment kodu zmodyfikowany przeze mnie:
#define NHASH 29
#define HASH(id) (((unsigned long)id)%NHASH)
struct foo *fh[NHASH];
pthread_mutex_t hashlock = PTHREAD_MUTEX_INITLIALIZER;
struct foo {
int f_count;
pthread_mutex_t f_lock;
int f_id;
struct foo *f_next; /* protected by hashlock */
};
struct foo *foo_alloc(int id) {
struct foo *fp;
int idx;
if ((fp = malloc(sizeof(struct foo))) != NULL) {
/* ------------POCZATEK MODYFIKACJI ---------------- */
if (pthread_mutex_init(&fp->f_lock, NULL) != 0) {
free(fp);
return(NULL);
}
pthread_mutex_lock(&fp->f_lock);
fp->f_count = 1;
fp->f_id = id;
idx = HASH(id);
pthread_mutex_unlock(&fp->f_lock);
/* ----------KONIEC MODYFIKACJI------------------*/
pthread_mutex_lock(&hashlock);
fp->f_next = fh[idx];
fh[idx] = fp;
pthread_mutex_lock(&fp->f_lock);
pthread_mutex_unlock(&haslock);
/* continue initialization */
pthread_mutex_unlock(&fp->f_lock);
}
return(fp);
} /* allocate the object */
}
Chodzi o to, że autor książki nie użył mutexu do zablokowania wątku po wykonaniu funkcji malloc
i przypisuje wartości zmiennym nowo-zaalokowanego obiektu bez blokowania wątku. Mi się wydaje, że wątek przy inicjalizacji zmiennych powinien być zablokowany dla innych wątków. Mam rację czy jest to błędny tok rozumowania?