用int a
代表產品數量最少0最多10,有兩個生產者,三個消費者,用多執行緒和條件變數模擬生產消費過程:
#include #include #include #include #include #include #include //產品0-10
int a = 0;
//條件變數,互斥變數
pthread_cond_t cond_produce, cond_consume;
pthread_mutex_t mutex;
//生產過程
void *produce(void *ar**)
return null;
}//消費過程
void *consume(void *ar**)
return null;
}//初始化兩個生產者和三個消費者
void initiate(pthread_t *producer1, pthread_t *producer2, pthread_t *customer1,
pthread_t *customer2, pthread_t *customer3)
int main()
執行結果:
·····發現產品a會超過10也會小於0,剛開始以為生產者2生產後:11
消費者1消費後:10
消費者1消費後:9
消費者1消費後:8
消費者1消費後:7
消費者1消費後:6
消費者1消費後:5
消費者1消費後:4
消費者1消費後:3
消費者1消費後:2
消費者1消費後:1
消費者1消費後:0
消費者2消費後:-1
pthread_cond_signal()
會產生驚群效應,但後來實驗了一下並不會,再查資料就知道了虛假喚醒:
維基百科翻譯:當執行緒從等待已發出訊號的條件變數中喚醒時,就會發生虛假喚醒,但發現它正在等待的條件未得到滿足。 它被稱為虛假的,因為執行緒似乎無緣無故地被喚醒了.但虛假的喚醒不會無緣無故地發生:它們通常發生是因為,在條件變數發出訊號的時間和等待執行緒最終執行的時間之間,另乙個執行緒執行並更改了條件.執行緒之間存在爭用條件,典型的結果是,有時,在條件變數上喚醒的執行緒首先執行,贏得比賽,有時它執行第二,輸掉比賽。
在許多系統上,特別是多處理器系統上,虛假喚醒的問題會加劇,因為如果在發出訊號時有多個執行緒等待條件變數,系統可能會決定將它們全部喚醒,將每個喚醒乙個執行緒視為喚醒所有執行緒,從而打破了訊號和喚醒之間任何可能預期的1:1關係。 如果有十個執行緒在等待,則只有乙個執行緒獲勝,其他九個執行緒將經歷虛假喚醒。
記一次gpio喚醒除錯
使用tp的irq腳做手勢喚醒。雙擊螢幕後,從log看cpu已經被喚醒了,但很快又睡下去,通過log分析,發現沒有進入中斷處理函式。這裡使用的電平中斷。以前已分析過電平 邊沿喚醒cpu流程列印發現handle level irq只跑了一遍,第二次的handle level irq沒有過來導致無法進入中...
記一次前端bug排查
前言 時隔三年,終於記得要找回賬號密碼開始寫筆記了,這周剛加入了乙個後台管理系統專案,測試反饋系統重新整理時經常會直接登出,嚴詞要求解決這個 重大 bug,so尷尬。更嚴重的是發現系統在ie上直接登不進去,嬸可忍叔不可忍,於是我開啟了苦逼的尋bug之路。既然是登出了,當然會有登出請求,chrome重...
記一次sum SQL 統計BUG
create table asgard share records id bigint 20 not null comment 分享記錄id status tinyint 3 unsigned not null default 1 comment 資料狀態 1 正常 0 刪除 create time...