條件變數(cond):
為什麼需要條件變數?
當乙個執行緒互斥的訪問某個變數時,它可能發現在其他執行緒改變該變數狀態之前,它什麼也做不了!(此時就是死鎖,一種僵死狀態)
我們需要一種機制,當互斥量鎖住以後,當前執行緒還是無法完成自己的操作,那麼就應該釋放互斥量,讓其他執行緒繼續工作。
1. 可以用輪詢機制,不停的查詢你需要的條件;
2. 用條件變數機制;
條件變數函式:
(1)初始化
函式初始化
int pthread_cond_init(pthread_cond_t *restrict cont,const pthread_condattr_t *restrict attr);
引數:跟互斥量相似
cond: 要初始化的條件變數;
attr: 條件變數屬性,一般設為null;
當然也可以用巨集: pthread_cont_initalizer 靜態初始化
pthread_cond_t cond =pthread_cont_initalizer;
(2)等待條件滿足
//非阻塞,
int pthread_cond_timedwite(pthread_conda_t *restrict cond,pthread_mutex_t *restrict mutex,const
struct timespec *restrict abstime);
//阻塞
int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);
引數:
cond: 要在這個條件變數上等待;
mutex: 互斥量
abstime: 指定等待時間,如果在規定時間沒有通知,返回 etimedout錯誤;
pthread_cond_wait()做的三件事:
1,釋放鎖—->2,等待鎖—->3,收到條件資訊,嘗試獲取鎖
(3)喚醒等待
//喚醒改條件變數上的所有執行緒
int pthread_cond_broadcast(pthread_cond_t *cond);
//至少喚醒乙個等待的執行緒
int pthread_cond_signal(pthread_cond_t *cond);
(4)銷毀條件變數
int pthread_cond_destroy(pthread_cond_t *cond);
例子:
有全域性變數money;主線程減小money,當money等於0時,子執行緒使money加上200;
#include
#include
#include
#include
pthread_cond_t cond; //定義條件變數
pthread_mutex_t mutex; //定義互斥量
int money; //定義全域性資源
//執行緒函式
void* pthread_func(void* arg)
//讓子執行緒進入臨界區檢視
if(money==0)
//解鎖
pthread_mutex_unlock(&mutex);
sleep(1);
}return null;
}int main()
//解鎖
pthread_mutex_unlock(&mutex);
//如果money=0就通知子執行緒
if(money==0)
sleep(1);
}return
0;}
結果:
執行緒同步 條件變數
當我們需要控制對記憶體資源的訪問的時候,可以用一種簡單的加鎖的方法來控制,即互斥鎖。但互斥鎖有乙個明顯的缺點,就是它只有兩個狀態 鎖定和非鎖定。而條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補來互斥鎖的不足。條件變數通常和互斥鎖一起使用。使用過程 1.呼叫pthread mutex ...
執行緒同步 條件變數
1.問題引入 互斥鎖問題,假設現在有兩個資源a和b,乙個執行緒先拿a再拿b,另乙個則相反,這樣導致的問題就是死鎖,即兩個執行緒無休止的互相等待 include include include include pthread mutex t g mtxa pthread mutex initializ...
執行緒同步 條件變數
多執行緒中條件變數的使用 執行緒同步之條件變數 include include include include include include include include using namespace std 乙個簡單的緩衝區類 struct buffer bool full return f...