2016-10-24 116 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); 
}