#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. 堵塞任務線程 2. 將任務添加進人物隊列 3. 判斷是否有空閒線程 4. 喚醒線程 5. 完成任務 6. 從新堵塞線程
單線程池安全
每次只有一個線程工做多線程
固定線程池函數
線程池中線程的數量固定,當達到線程池最大數量時,後續任務進入等待隊列post
可緩存線程池線程
當任務超出線程數量時,添加線程,當線程池空閒線程數量過多時,回收部分空間指針
無限制線程池rest
線程池大小無限制,支持定時和週期性執行code
1. 控制線程產生數量,控制線程對象的內存消耗 2. 下降系統開銷和資源消耗 3. 提升系統響應速度
#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的線程在新的進程中運行