2010-05-26 4 views
1

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

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

Любые мысли?

ответ

7

Ваш первый и второй случаи оба пытаются инициализировать rwlock для указателя, который указывает нигде (ну, технически, в случайное или NULL-местоположение).

В первом случае вы выделяете пространство для своей структуры обертки, но не внутри него 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).

+0

Обратите внимание, что '->' имеет более высокий приоритет, чем '&' (он имеет самый высокий приоритет для всех), поэтому скобки не нужны. – caf

+0

Хорошая точка, @caf, это только я, будучи старым туманом. Меня научили указывать намерение в моем коде, и я читал это как адрес поля rwlock внутри структуры. '& run-> rwlock' не читается так ясно, как это можно было бы увидеть как' (& running) -> rwlock' - и да, я знаю, что это не так, но это более субъективная читаемость с моей стороны. Я вряд ли изменится в моем возрасте :-) – paxdiablo

+0

Ahhhh! Я предположил, что pthread_rwlock_init сделал свой собственный malloc внутри, спасибо за вашу помощь. – KermitG

Смежные вопросы