1. 執行緒的建立和退出
執行緒的建立是用下面的幾個函式來實現的.
#includeint pthread_create(pthread_t *thread,pthread_attr_t *attr,
void *(*start_routine)(void *),void *arg);
void pthread_exit(void *retval);
int pthread_join(pthread *thread,void **thread_return);
pthread_create建立乙個執行緒,thread是用來表明建立執行緒的id,attr指出執行緒建立時候的屬性,我們用null來表明使用預設屬性。start_routine函式指標是執行緒建立成功後開始執行的函式,arg是這個函式的唯一乙個引數。表明傳遞給start_routine的引數。
pthread_exit函式和exit函式類似用來退出執行緒.這個函式結束執行緒,釋放函式的資源,並在最後阻塞,直到其他執行緒使用pthread_join函式等待它。然後將*retval的值傳遞給**thread_return.由於這個函式釋放所以的函式資源,所以retval不能夠指向函式的區域性變數。 pthread_join和wait呼叫一樣用來等待指定的執行緒。
2.mutex執行緒訪問控制
初始化:
在linux下, 執行緒的互斥量資料型別是pthread_mutex_t. 在使用前, 要對它進行初始化:
對於靜態分配的互斥量, 可以把它設定為pthread_mutex_initializer, 或者呼叫pthread_mutex_init.
對於動態分配的互斥量, 在申請記憶體(malloc)之後, 通過pthread_mutex_init進行初始化, 並且在釋放記憶體(free)前需要呼叫pthread_mutex_destroy.
原型:
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restric attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
返回值: 成功則返回0, 出錯則返回錯誤編號.
說明: 如果使用預設的屬性初始化互斥量, 只需把attr設為null. 其他值在以後講解.
互斥操作:
對共享資源的訪問, 要對互斥量進行加鎖, 如果互斥量已經上了鎖, 呼叫執行緒會阻塞, 直到互斥量被解鎖. 在完成了對共享資源的訪問後, 要對互斥量進行解鎖.
首先說一下加鎖函式:
原型:
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
返回值: 成功則返回0, 出錯則返回錯誤編號.
說明: 具體說一下trylock函式, 這個函式是非阻塞呼叫模式, 也就是說, 如果互斥量沒被鎖住, trylock函式將把互斥量加鎖, 並獲得對共享資源的訪問許可權; 如果互斥量被鎖住了, trylock函式將不會阻塞等待而直接返回ebusy, 表示共享資源處於忙狀態.
再說一下解鎖函式:
原型: int pthread_mutex_unlock(pthread_mutex_t *mutex);
返回值: 成功則返回0, 出錯則返回錯誤編號.
死鎖:
死鎖主要發生在有多個依賴鎖存在時, 會在乙個執行緒試圖以與另乙個執行緒相反順序鎖住互斥量時發生. 如何避免死鎖是使用互斥量應該格外注意的東西.
總體來講, 有幾個不成文的基本原則:
對共享資源操作前一定要獲得鎖.
完成操作以後一定要釋放鎖.
盡量短時間地占用鎖.
如果有多鎖, 如獲得順序是abc連環扣, 釋放順序也應該是abc.
執行緒錯誤返回時應該釋放它所獲得的鎖.
3.訊號量執行緒控制
除了使用互斥鎖,訊號量,也就是作業系統中所提到的pv原語,能達到互斥和同步的效果。
pv原語是對整數計數器訊號量sem的操作,一次p操作可使sem減一,而一次v操作可是sem加一。程序(或執行緒)根據訊號量的值來判斷是否對公共資源具有訪問許可權。當訊號量的值大於零或等於零的時候,該程序(或執行緒)具有對公共資源訪問的許可權,否則,當訊號量的值小於零時,該程序(或執行緒)就會被阻塞,直到訊號量的值大於或等於零。
在linux中,實現了posix的無名訊號量,主要用於執行緒間的互斥同步,下面將簡單介紹一些函式介面:
(1)、sem_init
功能: 用於建立乙個訊號量,並初始化訊號量的值。
標頭檔案:
函式原型: int sem_init (sem_t* sem, int pshared, unsigned int value);
函式傳入值: sem:訊號量。
pshared:決定訊號量能否在幾個程序間共享。由於目前linux還沒有實現進
程間共享資訊量,所以這個值只能取0。
函式返回值: 0:成功。
-1:失敗。
(2)其他函式。
int sem_wait (sem_t* sem);
int sem_trywait (sem_t* sem);
int sem_post (sem_t* sem);
int sem_getvalue (sem_t* sem);
int sem_destroy (sem_t* sem);
功能:sem_wait和sem_trywait相當於p操作,它們都能將訊號量的值減一,兩者的區別在
於若訊號量的值小於零時,sem_wait將會阻塞程序,而sem_trywait則會立即返回。
sem_post相當於v操作,它將訊號量的值加一,同時發出喚醒的訊號給等待的程序
(或執行緒)。
sem_getvalue 得到訊號量的值。
sem_destroy 摧毀訊號量。
函式傳入值: sem:訊號量。
函式返回值: 0:成功。
-1:失敗。
ARM Linux執行緒相關API
執行緒建立 pthread create 執行緒退出 pthread exit,這是執行緒的主動行為 執行緒資源 pthread join可以用於將當前執行緒掛起,等待執行緒的結束。這個函式是乙個執行緒阻塞的函式。呼叫它的函式將一直等待到被等待的執行緒結束為止,當函式返回時,被等待執行緒的資源就被收...
關於arm linux相關操作
主機 59.71.94.125 windows xp 虛擬機器192.168.1.128 ubuntu 10.10 ftp使用者名稱 密碼 ubuntu 1 一 批處理指令碼將虛擬機器中程式傳遞到sd卡中 在虛擬機器交叉編譯環境中編譯好的程式,將會放到路徑 home ubuntu ftp 下 sd卡...
linux 之執行緒基礎 二 執行緒相關API
2.1.1 程序id的資料型別 2.1.2 執行緒id的資料型別 注意 2.2.1 函式原型 include intpthread create pthread t thread,const pthread attr t attr,void start routine void void arg 2...