執行緒間通訊

2021-09-14 06:05:48 字數 3439 閱讀 1181

一、執行緒的競爭與同步

當多個執行緒同時訪問其所共享的資源時,需要相互協調,以防止出現資料不一致、不完整的問題,這就叫執行緒同步。

二、互斥量(互斥鎖)

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客戶端(資料的生產者)傳送資料給伺服器,為了讓客戶端及時得到反饋,伺服器會先把資料存在一塊緩衝區中(倉庫),然後伺服器從緩衝區中讀取資料(消費資料)進行解析、匹配、處理、儲存到(資料庫中)。

在這個過程中如果生產者和消費都協調不好會造成效率低下(並不一定會出錯),因此建立良好的生產者與消費模型是為了提高執行效率。

生產者與生產者之間的關係:生產者與生產者之間如果同時訪問同一塊緩衝區可能會造成資料覆蓋,因此生產者與生產者之間應該互斥的生產資料。

消費者與消費者之間的關係:如果消費者與消費者之間同時訪問一條資料可能會造成資料的重複,因此消費者與消費者之間應該互斥的消費資料。

生產者與消費者之間的關係:

如果生產者生產資料過快會被「撐死」,此時生產者應用提醒所有的消費都消費,然後生產者進行睡眠。

如果消費者消費資料過快會被「餓死」,此時消費者應該提醒所有的生產者生產,然後消費者進行睡眠。

執行緒間通訊

執行緒間通訊 多個執行緒在操作統一資源,但各個執行緒操作的動作不同。資源 class res class input implements runnable public void run else x x 1 2 class output implements runnable public vo...

執行緒間通訊

執行緒間的通訊 在乙個多執行緒的應用程式中,所有執行緒共享程序資源,協同工作。所以,執行緒之間的通訊是編寫多執行緒 應用的必不可少的環節。執行緒之間的通訊包括互斥 同步等,它是多 執行緒設計中最難控制的部分,也是關鍵部分。執行緒間的互斥 1 臨界區 在乙個多執行緒 的應用程式中,可能存在這樣的危險 ...

執行緒間通訊

執行緒間通訊 其實就是多個執行緒在操作同乙個資源 但是操作的動作不同。等待喚醒機制 wait notify 0 notifyall 都使用在同步中,因為要對持有監視器 鎖 的執行緒操作。所以要使用在同步中,因為只有同步才具有鎖 為什麼這些操作執行緒的方法要定義object類中呢?因為這些方法在操作同...