pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);和pthread_detach(pthread_self()); 有区别吗。怎么我执行的效果不一样

berniechen0123 2008-09-11 10:41:37
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>

void* task1(void*);
void* task2(void*);

int main()
{
pthread_t pid1, pid2;
pthread_attr_t attr;
int ret;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&pid1, &attr, task1, NULL);
ret=pthread_join(pid1, NULL);
printf("ret=%d\n", ret);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_create(&pid2, &attr, task2, NULL);
ret=pthread_join(pid2, NULL);
printf("ret=%d\n", ret);
return 1;
}

void* task1(void*)
{
printf("task1\n");
pthread_exit(NULL);
}

void* task2(void*)
{
pthread_detach(pthread_self());
printf("task2\n");
pthread_exit(NULL);
}


执行结果
ret=22
task1
task2
ret=0
第一个phread_join() 没有等待直接返回了
第二个phread_join() 等待,从返回值看执行成功了。
请大家帮忙看看
...全文
2937 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
berniechen0123 2008-09-12
  • 打赏
  • 举报
回复
已经解决了。感谢各位。原因很简单
After pthread_detach completes, subsequent attempts to perform
pthread_join on th will fail. If another thread is already joining the
thread at the time pthread_detach is called, pthread_detach does
nothing and leaves th in the joinable state.

pthread_join在pthread_detach之前执行了。
berniechen0123 2008-09-12
  • 打赏
  • 举报
回复
昨晚我试过了,pthread_detach(pthread_self()); 的返回值是0,
快乐田伯光 2008-09-12
  • 打赏
  • 举报
回复
那你看看pthread_detach(pthread_self())的返回值看看是不是成功的,因为有可能是主线程选执行join了这个线程,导致这个线程detach不成功。猜的,你试试.

[Quote=引用 3 楼 berniechen0123 的回复:]
我可能没说清楚,请注意看,我第二个线程里有这样 一句pthread_detach(pthread_self());
void* task2(void*)
{
pthread_detach(pthread_self());
printf("task2\n");
pthread_exit(NULL);
}

所以我觉得第二个pthread_join也应该失败。可它成功了。我觉得很奇怪。第一个我没问题
[/Quote]
快乐田伯光 2008-09-12
  • 打赏
  • 举报
回复
FC5下man pthread_detach的结果
RETURN VALUE
If the call succeeds, pthread_detach() shall return 0; otherwise, an error number
shall be returned to indicate the error.

看这个意思,应该是没有detach成功,应该是不能返回0,但我写了个程序测试,确实如果先join了,detach也返回0,看来这个man的解释不是很全面
unilgr 2008-09-12
  • 打赏
  • 举报
回复
第一种情况:
Linux/Unix的man都会有类似的说明:
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
DESCRIPTION
The detachstate attribute controls whether the thread is created in a detached state. If the thread is created
detached, then use of the ID of the newly created thread by the pthread_detach() or pthread_join() function is an error
问题比较明显,楼上几位也说清楚了

第二种情况:
这是正确的用法!只不过线程属性是JOINABLE时,一般pthread_detach用在线程注册的清理函数中
void pthread_cleanup_push(void (*routine)(void*), void *arg),进行动态detach,比如线程被cancel时,就能调用,而且cancel属性默认都是deferred, 所以调用pthread_join仍然很合理,可以准确知道线程的退出时间。但是你现在的用法也不会返回错误。这就是 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED)不能完全替代pthread_detach的原因



快乐田伯光 2008-09-12
  • 打赏
  • 举报
回复
4楼就是这个意思啊,因为先join了, 所以detach失败。只是我以为先join了的线程,detach会返回错误。
berniechen0123 2008-09-11
  • 打赏
  • 举报
回复
我可能没说清楚,请注意看,我第二个线程里有这样 一句pthread_detach(pthread_self());
void* task2(void*)
{
pthread_detach(pthread_self());
printf("task2\n");
pthread_exit(NULL);
}

所以我觉得第二个pthread_join也应该失败。可它成功了。我觉得很奇怪。第一个我没问题
快乐田伯光 2008-09-11
  • 打赏
  • 举报
回复
pthread_join()对象必须是未分离线程,你的第一个是join一个分离进程,所以没有返回0,面是返回了一个错误值
bshawk 2008-09-11
  • 打赏
  • 举报
回复
第一个当然不等待,你设置了它的属性为PTHREAD_CREATE_DETACHED! detecth什么意思? 很不专业的说,就是它独立(脱离)出去了,它可以自生自灭了,父线程不用理它了。
源码下载地址: https://pan.quark.cn/s/7a349ad53637 在地理信息系统(GIS)领域中,土地利用现状图被视为一种核心的数据可视化手段,其主要功能在于呈现特定区域的土地使用格局,涵盖农业、住宅、工业、绿地等多样化的土地利用类型。此类信息对于城市规划、环境分析、土地监管以及决策制定具有基础性作用。在编制土地利用现状图的过程中,符号库的构建与样式匹配环节是保障地图具备清晰度、精确性及视觉美感的核心步骤。所谓"样式匹配",是一种技术手段,旨在让用户能够将特定的符号或视觉样式与地图中的数据要素建立关联。在本资源中,提及的"样式匹配lyr"文件或许是一个ArcGIS(一种广受欢迎的GIS软件)所使用的图层样式文件,该文件内含了预设的图例符号及使用规范,用以区分不同的土地利用类别。用户若将此lyr文件导入至个人项目中,便能够迅速为土地利用现状图层赋予统一且专业的视觉表现。符号库则是指存储各类图形符号的集合,这些符号在地图上代表了不同的地理要素。对于土地利用现状图而言,每一类土地通常都会对应一个特定的符号,比如农田可能以绿色填充图案来表现,而建筑用地则可能采用灰色的实心形状。这些符号库对于统一地图的视觉呈现至关重要,有助于观者迅速把握地图所传递的信息。在ArcGIS软件中,用户能够通过"图层属性"界面来调控图层的视觉样式。在该界面中,用户可以选择"符号"面板来设定数据的可视化方式,或选择"标签"面板来管理要素的标注规则。借助"加载样式"功能,用户可以将"样式匹配lyr"文件中的样式规则应用到当前图层,以此规避逐一对每个土地利用类型进行符号的手动配置。不仅如此,为了达成卓越的可视化效果,可能还需对其他图层属性进行微调,例如调节透明度、设置比例尺依赖...
内容概要:本文围绕直流电机转速电流双闭环调速控制系统模型的研究,基于Matlab/Simulink平台实现了系统的建模仿真与动态性能分析。详细阐述了双闭环控制结构的设计原理,重点剖析转速环与电流环的协同控制机制,通过PI控制器实现对电机转矩和转速的精确调节,有效提升系统在负载扰动下的稳定性与响应速度。文中系统介绍了Simulink中各功能模块的搭建方法,包括电机本体模型、电流检测、转速反馈、调节器设计及PWM驱动等环节,并提供了关键参数整定策略与仿真结果验证,全面展示直流电机高性能调速控制的技术路径与工程实现细节。; 适合人群:具备自动控制原理、电力电子技术和Matlab/Simulink仿真基础的电气工程、自动化、机电一体化等专业的本科生、研究生,以及从事电机驱动与运动控制研发的工程技术人员。; 使用场景及目标:①用于高校课程设计、毕业设计或科研项目中直流电机控制系统的仿真建模与性能优化;②为工业现场高性能电机驱动系统的设计与调试提供理论依据与技术参考;③深入掌握双闭环PID控制在电机系统中的工程应用,提升系统动态响应、抗干扰能力和稳态精度。; 阅读建议:建议读者结合文中所述模型结构与参数设置,动手搭建Simulink仿真模型,重点理解内外环控制的耦合关系与PI调节器的动态调节过程,可通过改变负载条件和控制器参数进行对比实验,进一步探究先进控制策略(如自抗扰控制、模糊PID等)的改进潜力。

23,223

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧