聊聊pthread_cond_wait的虛假喚醒

小說:未來哪個行業最賺錢作者:海鄧成更新時間:2019-03-17字數:33839

她不祈求這一刻能延伸到天荒地老,她更希望,從今往后,她能時??匆娺@樣的一個丁寧。

微信一天可以轉多少錢

如畫一聲驚叫,李慶安笑著拍了拍她的臉道:“放心吧!大哥值錢的寶石他們可沒偷走?!?br/>只要你不傷害他在意的人他就就懶得去管你,而小李又沒有這么做,他不會遷怒小李的,更何況你沒看到劉皓用一種欣賞的目光看著小李嗎?他應該知道小李的一些事情,不然的話絕對不會如此?!辫F血凱完全不在意的說道,讓旗木卡卡西無可奈何,希望到時候你的得意門生出世了,你不會爆發吧。

風魂剛才念給隱娘聽的都是些經受時間考驗的千古名句,自然不是他人輕易比得上的,但這酒鬼能夠在這短短時間內作出一首還算佳作的詩詞來,倒也不算是全無本事。風魂看著他,微笑道:“請問老兄大名?”

聊聊pthread_cond_wait的虛假喚醒


使用條件變量時,僅僅從pthread_cond_wait返回就說條件成立是不恰當的。我們正確使用pthread_cond_wait的唯一方式是當線程被從pthread_cond_wait喚醒時,再檢查一下我們等待的條件(pthread_cond_wait的返回使得我們再次獲得mutex,這時我們可以講,我們擁有絕對的對等待條件的訪問權,我們對其狀態擁有絕對自信)

我看到有人把POSIX對pthread_cond_signal實現的約束(詳見apue page334)作為從pthread_cond_wait返回必須進行變量值檢查的原因,這不夠準確,根本原因只有一個,只有當前線程獲取到了被保護變量的mutex才能對被保護變量的值做推論。

為了更好的說明問題,假設有這樣一個應用場景:我們使用線程A,B來消費一個值,線程C用于生產這個值,生產后就廣播A與B,主線程等待他們。

 1 #include<stdio.h>
 2 #include<pthread.h>
 3 #include<stdlib.h>
 4 #include<unistd.h>
 5 #include<errno.h>
 6 #include<assert.h>
 7 #include<signal.h>
 8 
 9 
10 pthread_mutex_t mutex =PTHREAD_MUTEX_INITIALIZER;
11 pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
12 
13 volatile int value = 0;
14 
15 pthread_t tid;
16 pthread_t tid2;
17 pthread_t tid3;
18 
19 void* thread_func(void* arg) {
20     pthread_mutex_lock(&mutex);
21     
22     if (0 == value) {
23         pthread_cond_wait(&cond, &mutex);
24     }
25     printf("the thread_func is finished value = %d
", value);
26     value = 0;
27     pthread_mutex_unlock(&mutex);
28 }
29 
30 void* thread_func3(void* arg) {
31     pthread_mutex_lock(&mutex);
32     
33     if (0 == value) {
34         pthread_cond_wait(&cond, &mutex);
35     }
36     printf("the thread_func3 is finished value = %d
", value);
37     value = 0;
38     pthread_mutex_unlock(&mutex);
39 }
40 
41 void* thread_func2(void* arg) {
42     pthread_mutex_lock(&mutex);
43     value = 1;
44     pthread_cond_broadcast(&cond);
45     printf("the thread_func2 is finished value = %d
", value);
46     pthread_mutex_unlock(&mutex);
47 }
48 
49 int
50 main(int argc, char* argv[])
51 {
52 //    pthread_attr_t attr;
53 //    assert(0 == pthread_attr_init(&attr));
54 //    pthread_create(&tid2, NULL, thread_func2, NULL);
55 //    pthread_join(tid2, NULL);
56 //    printf("thread id = %ld
", tid);
57 //    printf("thread2 id = %ld
", tid2);
58 //    printf("thread3 id = %ld
", tid3);
59 //    printf("---------keep going---------
");
60 //    pthread_create(&tid, NULL, thread_func, NULL);
61 //    pthread_create(&tid3, NULL, thread_func3, NULL);
62 //    pthread_join(tid, NULL);
63 //    pthread_join(tid3, NULL);
64 //    pthread_cond_destroy(&cond);
65 
66     pthread_attr_t attr;
67     assert(0 == pthread_attr_init(&attr));
68     pthread_create(&tid, NULL, thread_func, NULL);
69     pthread_create(&tid3, NULL, thread_func3, NULL);
70     sleep(5);
71     printf("thread id = %ld
", tid);
72     printf("thread3 id = %ld
", tid3);
73     printf("make sure the thread and thread3 is created
");
74 
75     pthread_create(&tid2, NULL, thread_func2, NULL);
76     pthread_join(tid2, NULL);
77     pthread_join(tid, NULL);
78     pthread_join(tid3, NULL);
79     pthread_cond_destroy(&cond);
80     pthread_attr_destroy(&attr);
81 
82 }

程序中需要注意line70,為了使得pthread_cond_broadcast成功,這里被動等待了5s,其它的都沒啥說的。

我們假設thread_func收到廣播后先執行,thread_func持有mutex,所以thread_func3在從pthread_cond_wait這里返回就是失敗的,雖然收到了廣播,但是它壓根拿不到mutex。

等到thread_fucnc釋放mutex后,thread_func3開始執行,這時value的值已經不是thread_func3被通知時的值了(這個例子比較極端)。所以我們在從pthread_cond_wait返回后需要再驗證我們等待的value是否是期望的值。

那我們再進一步,thread_func3從pthread_cond_wait返回后再加個if判斷不就行了嗎???代碼如下:

...
//in the thread_func3
if(0 == value) {
    pthread_cond_wait();    
}
if(0 == value) {
    pthread_cond_wait();
}
...

那如果又發生了thread_func搶先消費掉value的情況呢?是不是又需要判斷一次value,如此往復,當然寫成這樣才是唯一解了:

while(0 == value) {
     pthread_cond_wait();   
}

好了,謝謝各位的閱讀。懇請批評指正!

當前文章:http://www.hfcxdn.com/content/01-06/95311/content_7125595073.html

發布時間:2019-03-17 02:35:08

花生日記加購物車批量付款是不是沒傭金 淘寶聯盟高傭破解貼吧 享賺怎么修改提現賬號 貝貝網里的賺 馬云的支付寶賺錢方法 有一些本金如何賺錢 星淘客新手怎么賺錢 卡商怎么賺錢

要掙錢的群名稱 在家呆著沒意思干什么 適合護士的25個副業 蜜源升運營商錢交給誰 立白 抽獎 好賺網 現在群控還賺錢不 貸款平臺靠什么賺錢 怎樣寫文章賺錢 一天快速賺錢的方法 貸款傭金怎么算法 蜜源看不到傭金 員工工作中注意安全 vps賺錢 安卓手機電腦同屏軟件 花生日記傭金不結算 微信投票 轉客聯盟軟件下載 家里電腦兼職賺錢 開個微商城需要多少錢

編輯:文戲

我要說兩句: (0人參與)

發布
捕鱼达人之深海狩猎