2009年6月19日 星期五

Linux下的pthread

在UNIX系統下,所有符合POSIX裡定義的thread implementation都可以稱為pthread。
Linux上則有一pthead實作的函式庫,叫pthread.h,去年修系統程式和今年寫OS作業時都有使用到,所以就來介紹一下它。

要使用pthread,必須先在開頭include
編譯時加上-lpthread。

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);

這函式主要是用來建立thread用,thread為放thread id的位置、attr是可以用來設定thread的屬性、start_routine則為註冊thread要去執行的function位置,最後的arg則是傳進去thread funtion的參數。
返回值: create成功的話回傳0,失敗時會回傳error代碼。


void pthread_exit(void *value_ptr);

這函式是會把呼叫它的thread結束掉,然後返回一個指標value_ptr給create他的thread。
creator那邊可以用pthread_join()去接他的value_ptr指標值。


int pthread_join(pthread_t thread, void **value_ptr);

執行函式的thread會等到裡面指定參數thread執行結束後才繼續執行。
如果他等待的thread式呼叫pthread_exit()結束時,可以用第二個參數value_ptr來接他傳回的指標。
返回值: 呼叫成功回傳0,失敗傳error代碼。


multipthraeing還有一個很大的議題是同步化的問題,做到資料的一致性,pthread裡為達到這功能是用mutex去做實作,mutex的type為pthread_mutex_t。

在使用mutex之前要先對mutex做初始化。
有一種方法是直接setting為PTHREAD_MUTEX_INITIALIZER 值。
另一種方法是呼pthread_mutex_ini()t。

如果是用動態malloc出mutex的話,在要release mutex的記憶體時要使用pthread_mutex_destroy()。


int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);

這函式用來做,mutex的初始化,第二個參數attr用來指定mutex的屬性。
返回值: 0是正常呼叫,並且會把一個mutex id放在mutex裡,失敗傳error代碼。


int pthread_mutex_destroy(pthread_mutex_t *mutex);

將動態allocate的mutex給free掉。
返回值: 0是正常,失敗回傳error代碼。


int pthread_mutex_lock(pthread_mutex_t *mutex);

用來取得mutex,A一取得mutex後在A呼叫unlock前,其他呼叫lock的thread都會在那裡等。
等到A unlock後,下一個拿到mutex的thread才能繼續執行。
返回值:
0是正常,失敗回傳error代碼。


int pthread_mutex_unlock(pthread_mutex_t *mutex);

如果呼叫這函式的thread有lock住mutex,那他會把mutex unlock。
返回值:
0是正常,失敗回傳error代碼。

沒有留言:

張貼留言