【操作系統篇】線程的競爭與同步

互斥量(互斥鎖)

pthread_mutex_t 互斥量就是一種特殊類型的對象,對它操作都只能使用函數執行。
man手冊中沒有,在頭文件pthread.h中。
int pthread_mutex_init(pthread_mutex_t *__mutex,const pthread_mutexattr_t *__mutexattr)
功能:初始化互斥量
__mutex:被初始化的互斥量
__mutexattr:可以使用此互斥量來初始化一個樣的互斥量,但也可以爲空。

int pthread_mutex_destroy (pthread_mutex_t *__mutex)
功能:銷燬一個互斥量

int pthread_mutex_lock (pthread_mutex_t *__mutex)
功能:對一個互斥量加鎖,如果已經被鎖上,則阻塞等待,直到被解鎖,然後加鎖成功返回。

int pthread_mutex_unlock (pthread_mutex_t *__mutex)
功能:對一個互斥量進行解鎖。

pthread_mutex_trylock (pthread_mutex_t *__mutex)
功能:嘗試對一個互斥量加鎖

pthread_mutex_timedlock (pthread_mutex_t *__restrict __mutex,const struct timespec *__restrict__abstime)
功能:定時鎖,在多少時間如果不能加鎖,則返回。

互斥量的使用規則:

1)、假定互斥量lock在非鎖定狀態下。
2)、線程1調用pthread_mutex_lock函數對lock執行加鎖操作,此時會立即返回,lock呈鎖定狀態。
3)、線程2調用pthread_mutex_lock函數對lock執行加鎖操作,此時線程2會阻塞,直到線程1調用pthread_mutext_unlock對lock進行解樂,線程2會lock再次加鎖才返回。

信號量(計數)

進程間的信號量,是保護多個進程共享的一些資源,而線程的信號量(sem_t)也是。
man手冊中沒有,在semaphore.h頭文件中。

int sem_init (sem_t *__sem, int __pshared, unsigned int __value)
功能:初始化信號量
__sem:被初始化的信號量
__pshared:0線程使用的,非0以共享內存的方式讓多個進程訪問(Linux不支持)。
__value:信號量的初始值

int sem_destroy (sem_t *__sem)
功能:銷燬信號量

int sem_wait (sem_t *__sem);
功能:對信號量執行減一操作,不能減測阻塞。

int sem_timedwait (sem_t *__restrict__sem,const struct timespec *__restrict __abstime);
功能:對信號量執行減一操作,在多少時間如果不能加減,則返回

int sem_trywait (sem_t *__sem);
功能:對信號量嘗試減一操作,能減返回0,不能減返回負1。

int sem_post (sem_t *__sem)
功能:對信號量執行加一操作。

int sem_getvalue (sem_t *__restrict __sem, int * __restrict __sval)
功能:獲取信號量的值。

注意:互斥量是任何時候都只能一個線程訪問共享資源(適合只有一個資源時),而信號量可以多個線程訪問資源(適合保護多個資源),如果信號量初始化爲1,則它與互斥量等待。

條件變量

pthread_cond_t 條件變量可以讓調用線程在滿足特定的條件下暫停,然後也被其它線程喚醒。

man手冊沒有,函數的聲明在pthread.h頭文件中。
int pthread_cond_init (pthread_cond_t* cond,const pthread_condattr_t* cond_attr);
功能:初始化條件變量
cond:被初始化的條件變量
cond_attr:用cond_attr初始化cond,如果爲空則只初始化cond

int pthread_cond_wait(pthread_cond_t* cond,pthread_mutex_t* mutex);
功能:使用調用線程睡入cond條件變量中,並把鎖mutex解開,當其它線程調用pthread_cond_signal函數時纔會再次醒來,醒來時會再次加鎖,如果加鎖失敗,則再次阻塞。

int pthread_cond_signal(pthread_cond_t *__cond)
功能:從條件變量cond從喚醒一個線程並令重新加鎖(如果不再加鎖則不能醒來)。

int pthread_cond_timedwait(pthread_cond_t *cond,pthread_mutex_t *mutex,struct timespec *time);
功能:使用調用線程睡入cond條件變量中,並把鎖mutex解開,並且指定睡眠時間。

int pthread_cond_broadcast (pthread_cond_t* cond)
功能:喚醒條件變量中的所有線程

int pthread_cond_destroy(pthread_cond_t *__cond)
功能:銷燬條件變量

生產者與消費者模型

是C/S構架常用的一處數據處理模型。
C客戶端(數據的生產者)發送數據給服務器,爲了讓客戶端及時得到反饋,服務器會先把數據存在一塊緩衝區中(倉庫),然後服務器從緩衝區中讀取數據(消費數據)進行解析、匹配、處理、存儲到(數據庫中)。
在這個過程中如果生產者和消費都協調不好會造成效率低下(並不一定會出錯),因此建立良好的生產者與消費模型是爲了提高運行效率。

生產者與生產者之間的關係:生產者與生產者之間如果同時訪問同一塊緩衝區可能會造成數據覆蓋,因此生產者與生產者之間應該互斥的生產數據。
消費者與消費者之間的關係:如果消費者與消費者之間同時訪問一條數據可能會造成數據的重複,因此消費者與消費者之間應該互斥的消費數據。
生產者與消費者之間的關係:
如果生產者生產數據過快會被“撐死”,此時生產者應用提醒所有的消費都消費,然後生產者進行睡眠。
如果消費者消費數據過快會被“餓死”,此時消費者應該提醒所有的生產者生產,然後消費者進行睡眠。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章