C语言调用pthread_create传入attr参数触发段错误问题咨询
段错误原因分析
- 核心触发原因:线程属性对象未初始化
pthread库要求
pthread_attr_t类型的变量在使用前必须调用pthread_attr_init(&attr)完成初始化操作。你的代码仅定义了属性变量attr,未做初始化就直接调用pthread_attr_setdetachstate修改属性,此时属性结构体内部存储的是栈上的随机野值,传入pthread_create时访问非法内存就会触发段错误。当你把参数替换为NULL时,pthread_create会使用默认的内置属性,不会访问非法内存,因此运行正常。
- 代码额外逻辑问题:分离态线程无法执行join操作
你将线程属性设置为
PTHREAD_CREATE_DETACHED(分离态),分离态线程运行结束后会自动释放所有系统资源,不需要也不允许调用pthread_join等待其退出,因此代码里的pthread_join调用必然返回非0错误值。另外线程创建完成后再修改属性对象不会对已经创建的线程产生任何影响,这也是代码注释标注该操作无效的原因。
修复方案
只需要在属性变量定义后添加初始化操作,使用完属性后调用销毁接口释放资源即可,修复后的参考代码如下:
#include <pthread.h> #include <unistd.h> #include <stdio.h> #include <string.h> void *my_fun(void *param){ printf("This is a thread that received %d\n", *(int *)param); return (void*)3; } int main(){ pthread_t t_id; pthread_attr_t attr; int arg=10, detachSTate; // 新增:初始化线程属性对象 pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); pthread_attr_getdetachstate(&attr,&detachSTate); if(detachSTate == PTHREAD_CREATE_DETACHED) printf("Detached\n"); pthread_create(&t_id, &attr, my_fun, (void *)&arg); printf("Executed thread with id %ld\n",t_id); // 新增:销毁不再使用的属性对象 pthread_attr_destroy(&attr); perror(""); sleep(3); int esito = pthread_join(t_id, (void **)&detachSTate); printf("Esito '%d' is different 0, error info: %s\n", esito, strerror(esito)); return 0; }
内容的提问来源于stack exchange,提问作者andrealorenzetti
相关产品推荐
相关产品推荐

