В вашем первом и втором случаях оба пытаются инициализировать rwlock для указателя, который нигде не указывает (ну, технически, на случайное или нулевое местоположение).
В первом случае вы выделяете место для вашей структуры-оболочки, но не pthread_rwlock_t*
внутри нее. Следовательно, это будет указывать на случайное местоположение.
Это будет работать с фактическим pthread_rwlock_t
вместо указателя на один:
struct rwlock_flag {
int flag; // Flag
pthread_rwlock_t rwlock; // Reader/writer lock for flag
};
struct rwlock_flag * running;
running = (struct rwlock_flag *) malloc (sizeof(struct rwlock_flag));
rslt = pthread_rwlock_init(&(running->rwlock), NULL);
Во втором, аналогично, отсутствует резервное хранилище для rwlock_dg2
, поэтому оно либо указывает на случайное расположение (если размещено внутри функции), либо на NULL (если объявлено на уровне файла). Вам нужно:
pthread_rwlock_t * rwlock_dg2 = malloc (sizeof (pthread_rwlock_t));
pthread_rwlock_init(rwlock_dg2,NULL);
Ваш третий случай, который работает, делает это, потому что указатель &rwlock_dg
фактически указывает на реальное pthread_rwlock_t
(что, конечно, rwlock_dg
).