linux筆記之條件變數

2021-07-29 21:16:22 字數 2153 閱讀 1497

條件變數的銷毀函式

條件變數等待函式

條件變數有兩個等待函式。二者的區別就在於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...