簡體   English   中英

pthread_cond_broadcast 在一個 pthread_mutex_unlock 之前和之后

[英]pthread_cond_broadcast before and after one pthread_mutex_unlock

對於下面的代碼,在執行第二個 cond_broadcast 時互斥鎖將不可用(假設多個線程已經在等待條件)。 在這種情況下,廣播 select 是線程(等待條件)將互斥鎖交給並等待互斥鎖被其他線程解鎖還是忽略第二個 cond_broadcast ?

void* func(void* arg){
pthread_mutex_lock(&m);
while(condition){
pthread_cond_wait(&c,&m);
}
pthread_cond_broadcast(&c);
pthread_mutex_unlock(&m);
pthread_cond_broadcast(&c);
}

對於下面的代碼,在執行第二個 cond_broadcast 時互斥鎖將不可用(假設多個線程已經在等待條件)。

我認為您的意思是,在第二次調用 function 時,調用pthread_cond_broadcast()的線程將無法使用互斥鎖,但這無關緊要。 調用pthread_cond_broadcast()與持有任何互斥鎖無關。

或者您的意思是,在第二次廣播發生時,先前阻塞的線程之一將獲得互斥鎖,但是(1)不確定,並且(2)如果確實發生了,這對於播送。

在這種情況下,廣播 select 是線程(等待條件)將互斥鎖交給並等待互斥鎖被其他線程解鎖還是忽略第二個 cond_broadcast ?

兩者都不。 pthread_cond_broadcast()pthread_cond_signal()在鎖定或轉移對任何互斥鎖的控制方面沒有任何作用。 他們只是喚醒相關 CV 上阻塞的線程。 每個這樣的線程必須在從調用返回之前獲取互斥鎖是一個單獨的考慮因素——它們都正常競爭以鎖定互斥鎖,並且在它們這樣做之前不會從pthread_cond_wait()返回。 他們也不會在沒有先從等待返回然后再次調用pthread_cond_wait()的情況下返回等待。

但這並不意味着您代碼中的第二個pthread_cond_broadcast()必然無效。 剛剛喚醒的線程之一可能會在兩次調用之間循環並再次等待 CV,或者其他一些線程可能會到達 CV。 一旦第一個線程釋放互斥鎖,這就會成為可能,並且線程嘗試做的第一件事是另一個廣播這一事實並不能確保廣播在另一個線程開始等待之前發生。

您不太可能希望像這樣一個接一個地進行兩個廣播,但是您保留哪一個對程序的整體語義幾乎沒有影響(如果有的話)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM