簡體   English   中英

如果在調用pthread_cond_wait()之后,另一個線程獲取被鎖定的互斥鎖然后調用phread_cond_broadcast會發生什么?

[英]What happens if after calling pthread_cond_wait(), another thread acquires the mutex that was locked and then phread_cond_broadcast is called?

所以讓我們說在一個線程中,你調用pthread_cond_wait() 在調用之后,該線程的互斥鎖被解鎖,現在線程被鎖定在條件變量上。 現在讓我們說另一個線程獲得對該鎖的訪問權限。 調用pthread_cond_broadcast后會發生什么? 在等待調用之后獲得對互斥鎖的控制的其他線程是否會失去對互斥鎖的控制? 究竟發生了什么?

線程通常會爭用互斥鎖。 什么都不會發生。 您可以將pthread_cond_wait視為:

  1. 以原子方式解鎖互斥鎖並阻塞條件變量。

  2. 嘗試正常重新獲取互斥鎖。

  3. 返回。

pthread_cond_wait(&cv, &m)等待兩個事件; 發信號以調節變量cv和互斥鎖m重新獲取鎖定。

在以下代碼段中,

pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cv = PTHREAD_COND_INITIALIZER;
void producer_thread() {
    pthread_mutex_lock(&m);         // p1
    // modify some_cond             // p2
    pthread_cond_broadcast(&cv);    // p3
    pthread_mutex_unlock(&m);       // p4
}
void consumer_thread() {
    pthread_mutex_lock(&m);         // c1
    while (!some_cond)              // c2
        pthread_cond_wait(&cv, &m); // c3
    pthread_mutex_unlock(&m);       // c4
}

這是一個可能的執行。

  • c1:獲得鎖定
  • c2:some_cond不滿意
  • c3:釋放鎖定並等待信令
  • p1:獲得鎖定
  • p2:滿足some_cond
  • p3:信號(廣播)到線程等待cv
  • c3: 通過信號通知cv喚醒,嘗試重新獲取鎖定,但再次阻止。
  • p4:釋放鎖定
  • c3:重新獲得鎖定的成功。
  • c2:some_cond滿足並退出while循環。
  • c4:釋放鎖定

暫無
暫無

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

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