我怀疑我在做一些愚蠢的事情,但是当我尝试在嵌入在结构中的rwlock上运行pthread_rwlock_init()时,我在嵌入式Linux平台(GCC编译器)上遇到了seg错误。
struct rwlock_flag {
int flag; // Flag
pthread_rwlock_t * rwlock; // Reader/writer lock for flag
};
以下导致seg故障......
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);
有什么想法吗?
答案 0 :(得分: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
)。