信號量,鎖,條件變量的區別

互斥鎖

[plain] view plaincopy
  1. pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;  
  2. 或  
  3. pthread_mutex_t mutex;  
  4. int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)  
  5. int pthread_mutex_lock(pthread_mutex_t *mutex)  
  6. int pthread_mutex_unlock(pthread_mutex_t *mutex)  
  7. int pthread_mutex_trylock(pthread_mutex_t *mutex)  


信號量

[plain] view plaincopy
  1. sem_t sem_event;  
  2. int sem_init(sem_t *sem, int pshared, unsigned int value)   
  3. int sem_destroy(sem_t * sem)   
  4. int sem_post(sem_t * sem)  
  5. int sem_wait(sem_t * sem)  
  6. int sem_trywait(sem_t * sem)  
  7. int sem_getvalue(sem_t * sem, int * sval)  


條件變量

[plain] view plaincopy
  1. pthread_cond_t cond=PTHREAD_COND_INITIALIZER;  
  2. 或  
  3. pthread_cond_t cond;  
  4. int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr)  
  5. int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)  
  6. int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t   
  7. *mutex, const struct timespec *abstime)  
  8. pthread_cond_signal()  

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

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

以下兩篇文章。

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

Posix線程編程指南(3)

http://www.ibm.com/developerworks/cn/linux/thread/posix_threadapi/part3/

2:一篇博客講解區別

http://www.cnblogs.com/lonelycatcher/archive/2011/12/20/2294161.html

根據第二個博客的理解應該是:

線程同步:何時互斥鎖不夠,還需要條件變量?

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

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

沒有順序上的概念。

 

再看信號燈和條件變量

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

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

 


轉自:http://blog.csdn.net/cjsafty/article/details/7850293

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