記一次由虛假喚醒產生的bug

2022-09-19 09:00:09 字數 1432 閱讀 6428

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()

執行結果:

·····

生產者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

發現產品a會超過10也會小於0,剛開始以為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...