void pthread_cleanup_push(void (*routine)(void *), void *arg);
??? 功能:注冊一個線程清理函數
??? 參數,routine,線程清理函數的入口
???????? arg,清理函數的參數。
??? 返回值,無
void pthread_cleanup_pop(int execute);
??? 功能:調用清理函數
??? execute,非0? 執行清理函數
???????????? 0 ,不執行清理
????????????
??? 返回值,無
這兩個成對使用
線程控制:互斥與同步
??? 概念:
??? 互斥 ===》在多線程中對臨界資源的排他性訪問。
??? 互斥機制 ===》互斥鎖? ===》保證臨界資源的訪問控制。
pthread_mutex_t?? mutex;
??? 互斥鎖類型??????? 互斥鎖變量 內核對象
??? 框架:
??? ?定義互斥鎖 ==》初始化鎖 ==》加鎖 ==》解鎖 ==》銷毀
???????? ****????????????????????? ***????? ***
??? ?1、定義:
???????? pthread_mutex_t?? mutex;
??? ?2、初始化鎖
???????? int pthread_mutex_init(
???????????? pthread_mutex_t *mutex,
???????????? const pthread_mutexattr_t *attr);
???????? 功能:將已經定義好的互斥鎖初始化。
???????? 參數:mutex 要初始化的互斥鎖
???????????? ? atrr? 初始化的值,一般是NULL表示默認鎖
???????? 返回值:成功 0
????????????????? 失敗 非零
3、加鎖:
???????? int pthread_mutex_lock(pthread_mutex_t *mutex);
???????? 功能:用指定的互斥鎖開始加鎖代碼
???????????? ? 加鎖后的代碼到解鎖部分的代碼屬于原子操作,
???????????? ? 在加鎖期間其他進程/線程都不能操作該部分代碼
???????????? ? 如果該函數在執行的時候,mutex已經被其他部分
???????????? ? 使用則代碼阻塞。
???????? 參數: mutex 用來給代碼加鎖的互斥鎖
???????? 返回值:成功 0
????????????????? 失敗 非零
??? ?4、解鎖
???????? int pthread_mutex_unlock(pthread_mutex_t *mutex);
???????? 功能:將指定的互斥鎖解鎖。
???????????? ? 解鎖之后代碼不再排他訪問,一般加鎖解鎖同時出現。
???????? 參數:用來解鎖的互斥鎖
???????? 返回值:成功 0
????????????????? 失敗 非零
5、銷毀
???????? ?int pthread_mutex_destroy(pthread_mutex_t *mutex);
???????? ?功能:使用互斥鎖完畢后需要銷毀互斥鎖
???????? ?參數:mutex 要銷毀的互斥鎖
???????? ?返回值:成功? 0
????????????????? ?失敗? 非零
6、trylock
???????? int pthread_mutex_trylock(pthread_mutex_t *mutex);
???????? 功能:類似加鎖函數效果,唯一區別就是不阻塞。
???????? 參數:mutex 用來加鎖的互斥鎖
???????? 返回值:成功 0
????????????????? 失敗 非零
????????????????? E_AGAIN
線程的同步 ===》同步 ===》有一定先后順序的對資源的排他性訪問。
??? 原因:互斥鎖可以控制排他訪問但沒有次序。
??? linux下的線程同步? ===》信號量機制 ===》semaphore.h?? posix
??? sem_open();
??? 信號量的分類:
??? 1、無名信號量 ==》線程間通信
??? 2、有名信號量 ==》進程間通信
框架:
??? 信號量的定義 ===》信號量的初始化 ==》信號量的PV操作===》信號量的銷毀。
阻塞
???????????? ? 1 表示綠燈,進程可以通過執行
???????? 返回值:成功? 0
????????????????? 失敗? -1;
??? 3、信號量的PV 操作
??? ?? P ===》申請資源===》申請一個二值信號量
??? ?? V ===》釋放資源===》釋放一個二值信號量
??? ?? P操作對應函數 ==》sem_wait();
??? ?? V操作對應函數 ==》sem_post();
??? int sem_wait(sem_t *sem);
??? 功能:判斷當前sem信號量是否有資源可用。
???????? ? 如果sem有資源(==1),則申請該資源,程序繼續運行
???????? ? 如果sem沒有資源(==0),則線程阻塞等待,一旦有資源
???????? ? 則自動申請資源并繼續運行程序。
???????? ? 注意:sem 申請資源后會自動執行 sem = sem - 1;
??? 參數:sem 要判斷的信號量資源
??? 返回值:成功 0
???????????? 失敗 -1
??? int sem_post(sem_t *sem);
??? 功能:函數可以將指定的sem信號量資源釋放
???????? ? 并默認執行,sem = sem+1;
???????? ? 線程在該函數上不會阻塞。
??? 參數:sem 要釋放資源的信號量
??? 返回值:成功 0
???????????? 失敗 -1;
??? 4、信號量的銷毀
??? ?? int sem_destroy(sem_t *sem);
??? ?? 功能:使用完畢將指定的信號量銷毀
??? ?? 參數:sem要銷毀的信號量
??? ?? 返回值:成功 0
????????????????? 失敗? -1;
互斥鎖和信號量區別:
用的地方:??? 唯一性互斥訪問,??? 不同線程順序
個數:??????? 1個鎖,? ???????????多個鎖
上鎖解鎖對象:同一個線程,??????? 處理順序用不同鎖
產生死鎖的主要原因:
(1) 因為系統資源不足。
(2) 進程運行推進的順序不合適。
(3) 資源分配不當等。
如果系統資源充足,進程的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則
就會因爭奪有限的資源而陷入死鎖。其次,進程運行推進順序與速度不同,也可能產生死鎖。
產生死鎖的四個必要條件:
(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 請求與保持條件:一個進程因請求資源而阻塞,得到的對已獲得的資源保持不放。
(3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。(高優先級運行,低優先級拿到鎖沒釋放不運行)
(4) 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。
Linux 里Sudo reboot重啟 在配置bash后