訊號量,鎖,條件變數的區別

2021-06-26 21:15:19 字數 1738 閱讀 7210

互斥鎖

[plain]view plain

copy

pthread_mutex_t mutex=pthread_mutex_initializer;  

或  pthread_mutex_t mutex;  

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)  

int pthread_mutex_lock(pthread_mutex_t *mutex)  

int pthread_mutex_unlock(pthread_mutex_t *mutex)  

int pthread_mutex_trylock(pthread_mutex_t *mutex)  

訊號量[plain]view plain

copy

sem_t sem_event;  

int sem_init(sem_t *sem, int pshared, unsigned int value)   

int sem_destroy(sem_t * sem)   

int sem_post(sem_t * sem)  

int sem_wait(sem_t * sem)  

int sem_trywait(sem_t * sem)  

int sem_getvalue(sem_t * sem, int * sval)  

條件變數

[plain]view plain

copy

pthread_cond_t cond=pthread_cond_initializer;  

或  pthread_cond_t cond;  

int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr)  

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)  

int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t   

*mutex, const struct timespec *abstime)  

pthread_cond_signal()  

互斥鎖沒什麼好說的。成對出現。

關鍵是訊號量和條件變數的使用場合。

以下兩篇文章。

1:講述:基本定義和用法

posix執行緒程式設計指南(3)

2:一篇部落格講解區別

根據第二個部落格的理解應該是:

執行緒同步:何時互斥鎖不夠,還需要條件變數?

假設有共享的資源sum,與之相關聯的mutex 是lock_s.假設每個執行緒對sum的操作很簡單的,與sum的狀態無關,比如只是sum++.

那麼只用mutex足夠了.程式設計師只要確保每個執行緒操作前,取得lock,然後sum++,再unlock即可.簡單的理解是,資源是很純粹的,

沒有順序上的概念。

再看訊號燈和條件變數

一般的生產者和消費者模型下,比如乙個佇列。還是應該使用訊號燈,因為,訊號燈是計數器,這樣佇列便可長可短。

但是如果涉及到某個條件的控制或者檢測,而不想用sleep的方法,顧名思義,就應當使用條件變數。

**:

訊號量 互斥鎖 條件變數的區別

訊號量用在多執行緒多工同步的,乙個執行緒完成了某乙個動作就通過訊號量告訴別的執行緒,別的執行緒再進行某些動作 大家都在semtake的時候,就阻塞在 而互斥鎖是用在多執行緒多工互斥的,乙個執行緒占用了某乙個資源,那麼別的執行緒就無法訪問,直到這個執行緒unlock,其他的執行緒才開始可以利用這個資源...

訊號量 互斥鎖 條件變數的區別

訊號量用在多執行緒多工同步的,乙個執行緒完成了某乙個動作就通過訊號量告訴別的執行緒,別的執行緒再進行某些動作 大家都在semtake的時候,就阻塞在 而互斥鎖是用在多執行緒多工互斥的,乙個執行緒占用了某乙個資源,那麼別的執行緒就無法訪問,直到這個執行緒unlock,其他的執行緒才開始可以利用這個資源...

訊號量 互斥鎖 條件變數的區別

原址 訊號量 互斥鎖 條件變數的區別 2009 12 22 13 05 分類 linux系統程式設計 訊號量用在多執行緒多工同步的,乙個執行緒完成了某乙個動作就通過訊號量告訴別的執行緒,別的執行緒再進行某些動作 大家都在semtake的時候,就阻塞在 而互斥鎖是用在多執行緒多工互斥的,乙個執行緒占用...