#簡介 本文僅表明我的觀點。學會線程的建立、傳參、釋放、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; }