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才能繼續執行。
返回值:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
如果呼叫這函式的thread有lock住mutex,那他會把mutex unlock。
返回值:
沒有留言:
張貼留言