pthread_rwlock_init()导致分段错误

时间:2010-05-26 16:35:58

标签: linux gcc embedded-linux pthreads

我怀疑我在做一些愚蠢的事情,但是当我尝试在嵌入在结构中的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);

有什么想法吗?

1 个答案:

答案 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)。

相关问题