2016-10-24 160 views
1

在pthread庫中,是否有一種簡單的方法可以指定首先喚醒線程的條件,如果多個線程正在等待相同的條件變量?C - Pthread_cond_signal - 信號最長等待線程

例如,假設我有3個線程正在等待條件變量,並且當我調用pthread_cond_signal時,我想喚醒等待的線程(換句話說,等待最長時間的線程)。

有沒有簡單的方法來完成這個?從我在代碼中可以看到的情況來看,pthread_cond_signal只是表示正在等待的線程之一,沒有特定的順序。

謝謝!

回答

0

是的,這應該用票鎖來完成。 https://en.wikipedia.org/wiki/Ticket_lock

一個例子可能看起來像

int current_waiting_thread_ticket = 0; 
int max_waiting_thread_ticket = 0; 
pthread_mutex_t mutex; //initialize somewhere 
pthread_cond_t cond; //initialize somewhere 

void lock() { 
    int local_ticket; 
    pthread_mutex_lock(&mutex); 

    // get current ticket 
    local_ticket = max_waiting_thread_ticket; 
    // set next ticket 
    max_waiting_thread_ticket++; 

    // wait until the local ticket is ready 
    while (current_waiting_thread_ticket != local_ticket) { 
     pthread_cond_wait(&cond, &mutex); 
    } 


    pthread_mutex_unlock(&mutex); 
} 

void unlock() { 
    pthread_mutex_lock(&mutex); 

    // next ticket is ready 
    current_waiting_thread_ticket++; 

    // wake up all waiting threads 
    pthread_cond_broadcast(&cond); 

    pthread_mutex_unlock(&mutex); 
}