條件變數的銷毀函式
條件變數等待函式
條件變數有兩個等待函式。二者的區別就在於pthread_cond_timedwait()比pthread_cond_wait()函式多了乙個引數abstime,此引數可以設定等待超時,如果達到abstime所指定的時刻,仍然沒有別的執行緒來喚醒當前執行緒,就返回etimedout。
pthread_cond_wait在阻塞式等待,這個函式做了以下三步操作:
1.釋放muxtex
2.阻塞等待
3.當被喚醒時,重新獲得mutex並返回條件變數喚醒函式
有兩個喚醒函式,區別是:
pthread_cond_signal喚醒的是某個condition variable上等待的另乙個執行緒,也可以呼叫
pthread_cond_broadcast喚醒在這個condition variadle上等待的所有執行緒
##三.**演示:
下列程式演示了乙個生產者-消費者的例子,表現同步互斥的效果以下**是只加了互斥鎖的**,在消費者執行緒中加入了sleep(100);
以達到增強生產者執行緒的競爭力的效果;**以及效果圖如下:
#include
#include
#include
#include
pthread_cond_t cond=pthread_cond_initializer;
pthread_mutex_t lock=pthread_mutex_initializer;
typedef struct _node
_node,*_node_p,**_node_pp;
_node_p alloc(int data)
_node->
data
=data;
_node->_next=
null;
return _node;
}void delete_node(_node_p temp)
static int is_empty(_node_p _h)
return0;}
void show_list(_node_p _h)
printf("\n");
}void pop_list(_node_p _h,int* _o)
}void init_list(_node_pp _h)
void destory_list(_node_p _h)
delete_node(_h);
}void push_list(_node_p _h,int data)
static void
* consumer(void
* _h)
}static void
* producter(void
* _h)
}int main()
結果圖如下:
出現了只生產不消費的情況。
要解決如上問題:則需要時生產者和消費者同步起來:使用條件變數.
static
void* consumer(void* _h)
pop_list(head,&data);
pthread_mutex_unlock(&lock);
printf("consumer:%d\n",data);
sleep(100);
}}static
void* producter(void* _h)
}
結果圖: Linux 之 條件變數
pthread cond init函式 pthread cond destroy函式 pthread cond wait函式 pthread cond timedwait函式 pthread cond signal函式 pthread cond broadcast函式 以上6 個函式的返回值都是 成...
Linux執行緒同步之條件變數
與互斥鎖不同,條件變數是用來等待而不是用來上鎖的。條件變數用來自動阻塞乙個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。條件變數使我們可以睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條件成立 而掛起 另乙...
linux 執行緒學習之條件變數
下面是乙個簡單的例子,我們可以從程式的執行來了解條件變數的作用。include include include pthread mutex t mutex pthread mutex initializer 初始化互斥鎖 pthread cond t cond pthread cond initia...