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)
有什么想法吗?
您的第一个和第二个案例都尝试初始化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).
| 归档时间: |
|
| 查看次数: |
1397 次 |
| 最近记录: |