Linux C多線程入門

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