pthread_rwlock_init()导致分段错误

Ker*_*itG 1 linux gcc pthreads embedded-linux

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

struct rwlock_flag {
    int flag;           // Flag
    pthread_rwlock_t * rwlock;  // Reader/writer lock for flag
};
Run Code Online (Sandbox Code Playgroud)

以下导致seg故障......

struct rwlock_flag * running;
running = (struct rwlock_flag *) malloc (sizeof(struct rwlock_flag));
rslt = pthread_rwlock_init(running->rwlock, NULL);
Run Code Online (Sandbox Code Playgroud)

就像这样......

pthread_rwlock_t * rwlock_dg2;
pthread_rwlock_init(rwlock_dg2,NULL);
Run Code Online (Sandbox Code Playgroud)

但是以下工作正常......

pthread_rwlock_t rwlock_dg;
pthread_rwlock_init(& rwlock_dg,NULL);
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

pax*_*blo 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);
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,类似地,没有后备存储,rwlock_dg2因此它指向随机位置(如果在函数内分配)或NULL(如果在文件级别声明).你需要:

pthread_rwlock_t * rwlock_dg2 = malloc (sizeof (pthread_rwlock_t));
pthread_rwlock_init(rwlock_dg2,NULL);
Run Code Online (Sandbox Code Playgroud)

你的第三种情况是有效的,因为指针&rwlock_dg实际指向一个真实的pthread_rwlock_t(当然rwlock_dg).