当前位置: 技术问答>linux和unix
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);和pthread_detach(pthread_self()); 有区别吗。怎么我执行的效果不一样
来源: 互联网 发布时间:2016-04-12
本文导语: #include #include #include 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...
#include
#include
#include
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=%dn", ret);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_create(&pid2, &attr, task2, NULL);
ret=pthread_join(pid2, NULL);
printf("ret=%dn", ret);
return 1;
}
void* task1(void*)
{
printf("task1n");
pthread_exit(NULL);
}
void* task2(void*)
{
pthread_detach(pthread_self());
printf("task2n");
pthread_exit(NULL);
}
执行结果
ret=22
task1
task2
ret=0
第一个phread_join() 没有等待直接返回了
第二个phread_join() 等待,从返回值看执行成功了。
请大家帮忙看看
|
那你看看pthread_detach(pthread_self())的返回值看看是不是成功的,因为有可能是主线程选执行join了这个线程,导致这个线程detach不成功。猜的,你试试.
|
第一种情况:
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的原因
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的原因
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。