Linux 開發之線程條件鎖那些事

條件鎖即在必定條件下觸發,那何時適合用條件鎖呢,那固然是你在等待一個符合的條件下觸發。一個經常使用的例子就是在線程中無限循環執行一個操做,可是這個操做並非須要 一直執行而是在知足必定條件下執行。例如:多線程

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會形成混亂。

相關文章
相關標籤/搜索