2017-01-13 4 views
0

Я хочу синхронизировать две темы, если это событие произойдет, я обнаружил, что многие Ressources предполагают использование pthread_cond в таких ситуациях, однако я не вижу разницы между использованием pthread_cond и mutexes:Лучшие ситуации использования pthread_cond_wait

Мы можем использовать следующий код:

// thread 1 waiting on a condition 
while (!exit) 
{ 
    pthread_mutex_lock(&mutex); //mutex lock 
    if(condition) 
    exit = true; 
    pthread_mutex_unlock(&mutex); 
} 
... reset condition and exit 

// thread 2 set condition if an event occurs 
pthread_mutex_lock(&mutex); //mutex lock 
condition = true; 
pthread_mutex_unlock(&mutex); 

Вместо:

//thread 1: waiting on a condition 
pthread_mutex_lock(&mutex); 
while (!condition) 
    pthread_cond_wait(&cond, &mutex); 
pthread_mutex_unlock(&mutex); 

//thread 2: signal the event 
pthread_mutex_lock(&mutex); 
condition = true; 
pthread_cond_signal(&cond); 
pthread_mutex_unlock(&mutex); 

кул d вы, пожалуйста, помогите мне, пожалуйста, о лучших практиках/ситуациях, в которых мы должны использовать pthread_cond

+0

Что касается ваш второй пример: 1. Вам не нужно запирать мьютексы, чтобы сигнализировать cond-var (хотя вы, безусловно, можете *). 2. Вам ** необходимо ** защелкнуть мьютекс до *, используя * (читать или писать) данные предиката (в вашем случае «условие»). Второй код никогда не устанавливает 'условие', поэтому, хотя сигнал будет происходить, цикл while никогда не прерывается (при условии, что он изначально ошибочен). Надеясь только на то, чтобы быть полезным и не самодовольным, [возможно, это поможет лучше понять] (https://stackoverflow.com/questions/14924469/does-pthread-cond-waitcond-t-mutex-unlock-and-then- блокировка-The-мьютекс/14925150 # 14925150). – WhozCraig

ответ

0

Ваш первый пример будет вращаться и использовать процессор все время, в то время как ожидание переменной условия приостанавливает процесс и не будет работать пока не будет сигнализирована переменная условия. Если у вас только один процессор в машине в первом примере, поток 1 может также закончить блокировку потока 2 в течение длительного времени, поэтому у него даже не будет возможности сигнализировать о состоянии.

Спиннинг - это отходы процессорного времени, отходы электричества и могут в конечном итоге быть намного большими.

(у вас есть ошибка в вашем втором примере, но я уверен, что это просто ошибка при составлении примеров, поэтому это хорошая практика, на самом деле есть готовые к выполнению и протестированных примеры в вопросах)

+0

ОК, исправьте ошибку, спасибо, спасибо – Mouin