当前位置:  技术问答>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的原因




    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3