Linux 多线程编程
/*************************************************************************>FileName:pthread.c>Author:zhaoxiaohu>Mail:191711783@qq.com>CreatedTime:Sat21Jul201811:40:55AMCST************************************************************************/#include<stdio.h>#include<pthread.h>#include<stdlib.h>//#defineTHREAD#defineJOINvoid*thread1(void*arg){pthread_detach(pthread_self());intarr[1024]={0};printf("thread1isrunninggoreturn\n");return1;}void*thread2(void*arg){printf("thread2isrunninggoexit\n");pthread_exit((void*)5);}void*thread3(void*arg){while(1){sleep(1);printf("thread3isrunningwaitexit\n");}returnNULL;}intmain(){pthread_ttid1;#ifdefTHREADwhile(1){if(!pthread_create(&tid1,NULL,thread1,NULL)){//pthread_join(tid1,NULL);printf("createok!!!\n");}elseprintf("createerror!!!\n");}#elsepthread_ttid2;pthread_ttid3;void*retval;pthread_create(&tid1,NULL,thread1,NULL);//创建线程#ifdefJOINpthread_join(tid1,&retval);#endifpthread_create(&tid2,NULL,thread2,NULL);#ifdefJOINpthread_join(tid2,&retval);printf("retval=%d\n",(int)retval);#endifpthread_create(&tid3,NULL,thread3,NULL);#ifdefJOINpthread_join(tid3,&retval);#endifprintf("iammainthreadtid1=%u,tid2=%u,tid3=%u\n",(unsignedlong)tid1,(unsignedlong)tid2,(unsignedlong)tid3);sleep(3);pthread_cancel(tid3);sleep(10);#endifreturn0;}
1、当没有定义THREAD宏,定义JOIN
创建三个线程,每个线程都通过pthread_join(等待线程退出);运行结果:
首先,创建三个线程,主线程分别用pthread_join等待其退出,因为pthread_join是阻塞等待,从而也就有先后顺序,从打印结果就可以看出;
2、当没有定义THREAD宏,没有定义JOIN
创建三个线程,后面加sleep;运行结果:
首先,创建三个线程,主线程没有用pthread_join等待其退出;如果没有加sleep,结果是:
因为创建了线程,根本没有时间执行,为啥呢?(因为主线程(进程)执行完退出了,从而到处所有线程结束,没有时间执行)。
所以主线程要sleep几秒,让你创建的线程有机会执行;而且你可以看到,没有用pthread_join等待时,线程执行顺序是不确定的。
你还可以发现,线程三的执行函数是一个while,这里只打印了2句while里的函数,因为用了pthread_cancel(取消线程);后面的sleep10所有的线程都退出了但是资源没有释放(占空间)为啥这样说呢?看下面:
3、当定义了THREAD宏
这时,主线程是一个while 去创建线程
1)当线程执行函数中有pthread_detach(线程分离),此时线程资源自动释放,结果:
2)当主线程用pthread_join(等待线程退出),此时结果:
比较1)和2),一个自动释放资源不用主线程干预,一个主线程join,然后释放资源,而且可以看到join表现了阻塞和执行顺序。
3)当线程执行函数没有pthread_detach(线程分离)和主线程没有pthread_join(等待线程结束),运行结果:
*为什么会出现create error;因为创建的线程有一个最大数,为啥呢:
一个程序到一个进程,从磁盘到虚拟内存的映射,而虚拟内存是有限的,32位,4g;而且1g个内核用了,所以用户只能使用3g,3g包含了代码段,数据段,堆栈,malloc的空间等,所以空间是有限;而每创建一个线程,默认分配8M的堆栈,所以当你没有释放资源时,空间肯定不够用,从而导致失败。(不是创建所有线程都失败,而是到那个最大值时出错的而失败的)
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。