ARM linux執行緒相關API

2021-05-05 01:43:55 字數 3088 閱讀 2362

1. 執行緒的建立和退出

執行緒的建立是用下面的幾個函式來實現的.

#include 

int 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...