2

我怀疑我在这里做了一些愚蠢的事情,但是当我尝试在嵌入在结构中的 rwlock 上运行 pthread_rwlock_init() 时,我在嵌入式 Linux 平台(GCC 编译器)上遇到了段错误。

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

有什么想法吗?

4

1 回答 1

8

您的第一种和第二种情况都尝试为无处指向的指针初始化 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)。

于 2010-05-26T16:45:15.037 回答