互斥鎖
[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的時候,就阻塞在 而互斥鎖是用在多執行緒多工互斥的,乙個執行緒占用...