detachstat分離狀態網絡
int pthread_attr_getdetachstat(const pthread_attr_t *restrict_attr,int *detachstate); int pthread_attr_setdetachstat(const pthread_attr_t *restrict_attr,int detachstate);
以默認方式啓動線程,在線程結束後不會主動釋放佔有的系統資源,要在主控線程中調用pthread_join()後纔會釋放。
以分離狀態啓動的線程,在線程結束後會自動釋放所佔有的系統資源。此時調用pthread_join()沒法取得子線程的返回結果,此種屬性在網絡通信中使用的較多。數據結構
同一進程中的其它線程取消,調用pthread_cancel(ptid);多線程
成對出現,壓入,彈出堆,先進後出調用自定義釋放資源函數併發
一種簡單的加鎖方法來控制對共享資源的訪問,在同一時刻只能有一個線程掌握某個互斥鎖,擁有上鎖狀態的線程可以對共享資源進行訪問。其餘線程但願上鎖一個已經被鎖上了互斥鎖的資源,則該線程掛起,直到上鎖的線程釋放互斥鎖爲止函數
#include <pthread.h> //鎖的數據結構類型 //初始化線程鎖 int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restric attr); //成功則返回0, 出錯則返回錯誤編號 //未能獲取鎖時,線程阻塞 int pthread_mutex_lock(pthread_mutex_t *mutex); //未能獲取鎖時,直接返回出錯信息 int pthread_mutex_trylock(pthread_mutex_t *mutex); //釋放鎖 int pthread_mutex_unlock(pthread_mutex_t *mutex);
線程使用互斥鎖缺少讀併發性,當讀操做比較多,寫操做比較少,可以使用讀寫鎖提升線和的併發性學習
//讀寫鎖的始化 pthread_rwlock_t rwlock; /** rwlock:讀寫鎖的pthread_rwlock_t結構指針 attr:讀寫鎖的屬性結構指針。不須要別的屬性默認爲NULL */ int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr); //加讀鎖 int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); //加寫鎖 int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); //釋放鎖 int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
條件變量是利用線程間共享的全局變量進行同步的一種機制,主要包括兩個動做:一個線程等待"條件變量的條件成立"而掛起;另外一個線程使"條件成立"(給出條件成立信號)。爲了防止競爭,條件變量的使用老是和一個互斥鎖結合在一塊兒。spa
phtread_cond_t *cond; //初始化條件變量 int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr) //註銷條件變量 int pthread_cond_destroy(pthread_cond_t *cond) //等待與激發 int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime)
不管那種等待方式,都必須與互斥鎖配合,以防止多個線程同時請求pthread_cond_wait()的竟態條件,且在調用pthread_cond_wait()前必須由本線程加鎖,而在更新條件等待隊列之前,mutex保持鎖定狀態,並在線線掛起進入等待前解鎖,在條件知足從而離開pthread_cond_wait()以前,mutex將從新加鎖,與進行pthread_cond_wait()以前狀態相對應。 執行pthread_cond_wait()時自動解鎖互斥量(如同執行了 pthread_unlock_mutex),並等待條件變量觸發。這時線程掛起,不佔用 CPU 時間,直到條件變量被觸發。
所以全程能夠分解成線程