linux線程

線程

線程建立

#include<pthread.h>
int pthread_creat(                  //建立線程,成功返回0,失敗返回errcode
        pthread_t   *thread,        //線程號     
        pthread_attr_t *attr,       //
        void *(*func)(void*),       //線程須要運行的函數
        void *arg                   //傳遞給func的參數      
                 )

int pthread_join(                   //等待線程終止,成功返回0,失敗返回errcode
        pthread_t   pthread,        //所等待的線程號
        void*   retval              //指向線程返回值
)

在linux中使用pthread.h頭文件須要鏈接lpthread庫linux

線程池

組成成分

  1. 線程池管理器
  2. 工做線程
  3. 任務接口
  4. 任務隊列緩存

    工做流程

    1. 初始化線程池
     2. 堵塞任務線程
     2. 將任務添加進人物隊列
     3. 判斷是否有空閒線程
     4. 喚醒線程
     5. 完成任務
     6. 從新堵塞線程

    常見線程池

  • 單線程池安全

    每次只有一個線程工做多線程

  • 固定線程池函數

    線程池中線程的數量固定,當達到線程池最大數量時,後續任務進入等待隊列post

  • 可緩存線程池線程

    當任務超出線程數量時,添加線程,當線程池空閒線程數量過多時,回收部分空間指針

  • 無限制線程池rest

    線程池大小無限制,支持定時和週期性執行code

優勢

1. 控制線程產生數量,控制線程對象的內存消耗
    2. 下降系統開銷和資源消耗
    3. 提升系統響應速度

通訊

線程

進程

  • 命名通道
    1. 通道是一個隊列而不是常規文件
    2. 其讀和寫是原子操做
  • 共享內存
    1. 共享內存段不依賴於進程存在
    2. 共享內存段的名字叫關鍵字
    3. 關鍵字是一個整型數
    4. 共享內存段有本身的擁有者己權限位
    5. 進程能夠鏈接共享內存段,並得到指針
  • 文件鎖
  • 信號量
  • 相關函數
    1. select、poll
    2. mkfio
    3. shmget、shmat、shmctl、shmdt(共享內存)
    4.semget、semctl、semop

同步

互斥量

#include <pthread.h>
int pthread_mutex_lock(                 //等待互斥鎖解開後鎖住互斥量,成功返回0
            pthread_mutex_t *mutex     //指向互斥鎖
)

int pthread_mutex_unlock(                  //解鎖互斥量,成功返回0
            pthread_mutex_t *mutex,        //指向互斥量
)

條件變量

#include <pthread.h>
int pthread_cond_wait(                      //掛起線程,等待信號量,成功返回0
            pthread_cond_t  *cond,          //
            pthread_mutex_t *mutex,         //指向互斥鎖對象
)

int pthread_cond_signal(                    //喚醒等待線程,成功返回0
        pthread_cond_t *cond)               //指向條件變量

pthread_cond函數老是和互斥鎖在一塊兒使用。此函數先自動釋放指定的鎖,而後等待條件變量的變化。若是在調用此函數以前,互斥量mutex並無被鎖住,函數執行的結果是不肯定的。在返回原調用函數以前,此函數自動將指定的互斥量從新鎖住。

信號量

#include <semaphore.h>
int sem_init(sem_t *sem,                //sem地址  
        int pshared,                   //0表示本進程中多個線程間同步,非0表示能夠跨進程的同步操做
        unsigned int value);             //信號量初值(計數器的值)
 P   int sem_wait(sem_t *sem);   // sem-1 若是小於0就阻塞
 V    int sem_post(sem_t *sem);   // sem+1

讀寫鎖

//初始化和銷燬
#include <pthread.h>
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
// 成功則返回0, 出錯則返回錯誤編號.

int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
// 成功則返回0, 出錯則返回錯誤編號.

int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
// 成功則返回0, 出錯則返回錯誤編號.

安全

在多線程程序中,頗有可能會將同一個文件描述符傳遞給兩個不一樣的線程。即傳遞給它們的兩個值指向同一個文件描述符。顯然若是一個線程中的函數關閉了這個文件,此文件描述符對此進程中的任何線程來講都已經被關閉。

fork建立了一個新的進程,並把原調用進程的數據和代碼複製給這個新的進程。若是線程中的某函數調用了 fork,只有調用fork的線程在新的進程中運行

相關文章
相關標籤/搜索