c 多線程

c 多線程學習

線程建立

線程的初始化與銷燬

detachstat分離狀態網絡

  1. PTHREAD_CREATE_JOINABLE(Default) 正常啓動線程
  2. PTHREAD_CREATE_DETACHED 以分離狀態啓動線程
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()沒法取得子線程的返回結果,此種屬性在網絡通信中使用的較多。數據結構

線程終止

主動終止

  1. 線程執行函數return
  2. 調用pthread_exit()

被動終止

同一進程中的其它線程取消,調用pthread_cancel(ptid);多線程

線程資源回收

成對出現,壓入,彈出堆,先進後出調用自定義釋放資源函數併發

  1. void pthread_cleanup_push(void (routine)(void ),void *arg);
  2. void pthread_cleanup_pop(int execute);

圖片描述

線程互斥

互斥鎖

一種簡單的加鎖方法來控制對共享資源的訪問,在同一時刻只能有一個線程掌握某個互斥鎖,擁有上鎖狀態的線程可以對共享資源進行訪問。其餘線程但願上鎖一個已經被鎖上了互斥鎖的資源,則該線程掛起,直到上鎖的線程釋放互斥鎖爲止函數

#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 時間,直到條件變量被觸發。
所以全程能夠分解成線程

  1. pthread_mutex_lock()上鎖
  2. pthread_cond_wait()等待,等待過程分解爲爲:解鎖--條件知足--加鎖
  3. pthread_mutex_unlock()解鎖
相關文章
相關標籤/搜索