linux下為了多線程同步,通常用到鎖的概念。
posix下抽象了一個鎖類型的結構:ptread_mutex_t。通過對該結構的操作,來判斷資源是否可以訪問。顧名思義,加鎖(lock)後,別人就無法開啟,只有當鎖沒有關閉(unlock)的時候才能訪問資源。
它主要用如下5個函數進行操作。
1:pthread_mutex_init(pthread_mutex_t * mutex,const pthread_mutexattr_t *attr);
初始化鎖變數mutex。attr為鎖屬性,NULL值為預設屬性。
2:pthread_mutex_lock(pthread_mutex_t *mutex);加鎖
3:pthread_mutex_tylock(pthread_mutex_t *mutex);加鎖,但是與2不一樣的是當鎖已經在使用的時候,返回為EBUSY,而不是掛起等待。
4:pthread_mutex_unlock(pthread_mutex_t *mutex);釋放鎖
5:pthread_mutex_destroy(pthread_mutex_t *mutex);使用完後釋放
下面經典例子為建立兩個線程對sum從1加到100。前面第一個線程從1-49,後面從50-100。主線程讀取最後的加值。為了防止資源競爭,用了pthread_mutex_t 鎖操作。
#include<stdlib.h>#include<stdio.h>#include<unistd.h>#include<pthread.h>typedef struct ct_sum{int sum;pthread_mutex_t lock;}ct_sum;void * add1(void * cnt){ pthread_mutex_lock(&(((ct_sum*)cnt)->lock)); int i; for( i=0;i<50;i++){ (*(ct_sum*)cnt).sum+=i;} pthread_mutex_unlock(&(((ct_sum*)cnt)->lock)); pthread_exit(NULL); return 0;}void * add2(void *cnt){ int i; cnt= (ct_sum*)cnt; pthread_mutex_lock(&(((ct_sum*)cnt)->lock)); for( i=50;i<101;i++) { (*(ct_sum*)cnt).sum+=i; } pthread_mutex_unlock(&(((ct_sum*)cnt)->lock)); pthread_exit(NULL); return 0;}int main(void){ int i;pthread_t ptid1,ptid2;int sum=0;ct_sum cnt;pthread_mutex_init(&(cnt.lock),NULL);cnt.sum=0;pthread_create(&ptid1,NULL,add1,&cnt);pthread_create(&ptid2,NULL,add2,&cnt);pthread_mutex_lock(&(cnt.lock));printf("sum %d\n",cnt.sum);pthread_mutex_unlock(&(cnt.lock));pthread_join(ptid1,NULL);pthread_join(ptid2,NULL);pthread_mutex_destroy(&(cnt.lock));return 0;}