條件鎖即在必定條件下觸發,那何時適合用條件鎖呢,那固然是你在等待一個符合的條件下觸發。一個經常使用的例子就是在線程中無限循環執行一個操做,可是這個操做並非須要 一直執行而是在知足必定條件下執行。例如:多線程
int changed = 0;函數
static pthread_mutext_t mtx = PTHREAD_MUTEX_INITALIZER;線程
static pthread_cond_t cond = PTHREAD_COND_INITALIZER;it
void* thread_fun(void* argc)thread
{變量
while(true)循環
{gc
if(changed)方法
{static
printf("i am changed");
}else
{
//方法一
sleep(1);
//方法二
pthread_mutex_lock(&mtx);
pthread_cond_wait(&cond,&mtx);
pthread_mutex_unloc(&mtx);
}
}
}
void main()
{
pthread_t threadId;
pthread_create(&threadId,NULL,thread_fun,NULL);
sleep(10);
changed = 1;
//方法二
pthread_cond_signal(&cond);
}
從上面的例子能夠看出當changed變量爲1的時候才執行操做,其餘時間不執行,若是使用sleep函數,那麼將會出現執行不及時的現象,若是使用條件鎖的話那麼會在條件改變的時候當即執行,效果比較好。
那若是使用條件鎖呢?
首先是條件鎖的建立,條件鎖建立有兩種方法,一種是靜態方法,既使用靜態變量的方式:
static pthread_cond_t cond = PTHREAD_COND_INITALIZER;
另一種是動態的方法:
pthread_cond_init(pthread_cond_t *cv,const pthread_condattr_t *cattr);
其次是等待: pthread_cond_wait,此方法能夠加超時的時間,若是沒有超時的時間則是一直等待。
再次是觸發:當達到條件以後使用 pthread_cond_signal通知
可是在多線程裏面必需要配合互斥鎖,由於在多線程的條件下若是不使用互斥鎖,那麼就有可能同時多個執行ptread_cond_wait會形成混亂。