互斥鎖
- 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)
信號量
- 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)
條件變量
- 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)
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