pthread_rwlock_init () вызывает ошибку сегментации - PullRequest
1 голос
/ 26 мая 2010

Я подозреваю, что делаю что-то глупое, но у меня возникают ошибки seg на встроенной платформе Linux (компилятор GCC), когда я пытаюсь запустить pthread_rwlock_init () на rwlock, встроенном в структуру.

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);

Как это ...

pthread_rwlock_t * rwlock_dg2;
pthread_rwlock_init(rwlock_dg2,NULL);

Однако следующее работает отлично ...

pthread_rwlock_t rwlock_dg;
pthread_rwlock_init(& rwlock_dg,NULL);

Есть мысли?

1 Ответ

7 голосов
/ 26 мая 2010

В вашем первом и втором случаях оба пытаются инициализировать 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).

...