首页 > 代码库 > thread_5

thread_5

#include<stdlib.h>#include<pthread.h>#include<stdio.h>#include<sched.h>#include<errno.h>void *consumer(void *p){      static a = 0;      a++;      printf("<<<<(%u),%d\n", (unsigned)pthread_self(), a);         pthread_detach(pthread_self());          return NULL;} /*获取线程标识符pthread_t pthread_self(void);返回调用线程的标识符,(是一个无符号整形数)*/       int main(int argc, char *argv[]){        pthread_t  t1, t2, t3;        int ret;        do{                 ret = pthread_create(&t1, NULL, consumer, NULL);                if(ret != 0)               {                         printf("create failed,%d\n", ret);                        exit(1);               }               printf("<<<<<");              }while(1);                  return 0;}  /*运行结果:只能创建一千个左右的线程,如下<<<<<<<<<<<<<<<<<<<<<(3128908688),1184<<<<<<<<<<<<<<<<<<<<<(3137301392),1185<<<<<<<<<<<<<<<<<<<<<(3145694096),1186create failed,12分析原因可能是主线程创建线程速度太快,子线程还来不及释放资源,最终导致资源不足, *///下面在主函数里面加一个printf(),就不会出问题了。/*总结如下:1.线程自己运行结束,或者调用pthread_exit()结束,线程都会释放自己独立的空间资源。2.如果线程是非分离的,线程会保留线程id号,直到其他线程通过"joining"这个线程确认其已死亡。join 的结果是joining 线程得到已终止线程的退出状态,已终止的线程将消失。*//*pthread_detach编辑创建一个线程默认的状态是joinable, 如果一个线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即还有一部分资源没有被回收(退出状态码),所以创建线程者应该调用pthread_join来等待线程运行结束,并可得到线程的退出代码,回收其资源(类似于wait,waitpid)但是调用pthread_join(pthread_id)后,如果该线程没有运行结束,调用者会被阻塞,在有些情况下我们并不希望如此,比如在Web服务器中当主线程为每个新来的链接创建一个子线程进行处理的时候,主线程并不希望因为调用pthread_join而阻塞(因为还要继续处理之后到来的链接),这时可以在子线程中加入代码pthread_detach(pthread_self())或者父线程调用pthread_detach(thread_id)(非阻塞,可立即返回)这将该子线程的状态设置为detached,则该线程运行结束后会自动释放所有资源。*//*比较线程IDint pthread_equal(pthread_t tid1, pthread_t tid2);如果tid1 和tid2 相等,pthread_equal() 将返回非零值,否则将返回零。如果tid1 或tid2 是无效的线程标识号,则结果无法预测。*/

 

thread_5