#简介 本文仅表明我的观点。学会线程的建立、传参、释放、mutex、rwlock、mq,能够解决90%以上的多线程问题。多线程
本文中全部代码编译经过,运行正常。并发
代码运行环境:操作系统
CPU:I5-3210M,内存:12GB DDR3 1600,系统:CentOS 6.7 64位 #什么是线程线程
线程是操做系统可以进行运算调度的最小单位。它被包含在进程中,是进程中的实际运做单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中能够并行多个线程,每条线程并行执行不一样的任务。————维基百科
线程并发,多核并行。 #线程的建立和释放 ##建立和释放 问题:Linux中1个进程建立的最大线程数小于1000000。若是下列程序中的线程正常释放了,那么输出1000000,不然输出建立的线程数。下列程序中线程正常结束的是?code
A、自动释放进程
//thread.c #include <pthread.h> #include <stdio.h> void *threadStart(void *arg){ return NULL; } int main(void){ int i; for(i=0;i<1000000;++i){ pthread_t thread; if(pthread_create(&thread,NULL,threadStart,NULL)!=0) break; } printf("建立线程%d个\n",i); return 0; }
编译:gcc -O2 thread.c -lpthread
内存
运行:./a.out
B、joinit
#include <pthread.h> #include <stdio.h> void *threadStart(void *arg){ return NULL; } int main(void){ int i; for(i=0;i<1000000;++i){ pthread_t thread; if(pthread_create(&thread,NULL,threadStart,NULL)!=0) break; pthread_join(thread,NULL); } printf("建立线程%d个\n",i); return 0; }
C、detachio
#include <pthread.h> #include <stdio.h> void *threadStart(void *arg){ return NULL; } int main(void){ int i; for(i=0;i<1000000;++i){ pthread_t thread; if(pthread_create(&thread,NULL,threadStart,NULL)!=0) break; pthread_detach(thread); } printf("建立线程%d个\n",i); return 0; }
D、cancel编译
#include <pthread.h> #include <stdio.h> void *threadStart(void *arg){ return NULL; } int main(void){ int i; for(i=0;i<1000000;++i){ pthread_t thread; if(pthread_create(&thread,NULL,threadStart,NULL)!=0) break; pthread_cancel(thread); } printf("建立线程%d个\n",i); return 0; }
E、exit
#include <pthread.h> #include <stdio.h> void *threadStart(void *arg){ pthread_exit(NULL); return NULL; } int main(void){ int i; for(i=0;i<1000000;++i){ pthread_t thread; if(pthread_create(&thread,NULL,threadStart,NULL)!=0) break; } printf("建立线程%d个\n",i); return 0; }
BC
记住Linux C线程只有两种释放方式:join和detach。 ##传参 下面线程输出0~9(顺序无关)的是? A、
#include <pthread.h> #include <stdio.h> void *threadStart(void *arg){ int *pI=(int*)arg; printf("%d\n",*pI); return NULL; } int main(void){ int i; pthread_t thread[10]; for(i=0;i<10;++i) { pthread_create(&thread[i],NULL,threadStart,&i); pthread_join(thread[i],NULL); } return 0; }
B、
#include <pthread.h> #include <stdio.h> void *threadStart(void *arg){ int *pI=(int*)arg; printf("%d\n",*pI); return NULL; } int main(void){ int i; pthread_t thread[10]; for(i=0;i<10;++i) pthread_create(&thread[i],NULL,threadStart,&i); for(i=0;i<10;++i) pthread_join(thread[i],NULL); return 0; }
C、
#include <pthread.h> #include <stdio.h> #include <stdlib.h> void *threadStart(void *arg){ int *pI=(int*)arg; printf("%d\n",*pI); free(pI); return NULL; } int main(void){ int i; pthread_t thread[10]; for(i=0;i<10;++i){ int *pI=(int*)malloc(sizeof(int)); *pI=i; pthread_create(&thread[i],NULL,threadStart,pI); } for(i=0;i<10;++i) pthread_join(thread[i],NULL); return 0; }
D、
#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> void *threadStart(void *arg){ int *pI=(int*)arg; printf("%d\n",*pI); free(pI); return NULL; } int main(void){ int i; pthread_t thread[10]; for(i=0;i<10;++i){ int *pI=(int*)malloc(sizeof(int)); *pI=i; pthread_create(&thread[i],NULL,threadStart,pI); pthread_detach(thread[i]); } usleep(1000); return 0; }