Eu escrevo um exemplo simples de pthread usando condição para sincronizar dois threads. em algum sinal de situação chamado antes de esperar e bloquear thread de espera para sempre.
Existe maneira de detectar o sinal antes de esperar?
void *Thread1(void *args){
sleep(1);
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond,&mutex);
pthread_mutex_unlock(&mutex);
}
void *Thread2(void *args){
pthread_mutex_lock(&mutex);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
Respostas:
3 para resposta № 1Pare de usar a variável de condição como sinalmecanismo, como eles não são. Você sempre precisa de uma variável real que armazene os dados. Quando você precisa usar os dados, primeiro verifique seu estado, e se o estado não é o que você quer que seja, você espera que a condição aconteça. Uma vez acordado, você verifica o estado novamente.
Você não pode usar variáveis de condição como sinais.
1 para resposta № 2
As variáveis de condição devem estar sempre emparelhadas com uma condição sobre algum estado compartilhado (chamado de predicado). Um exemplo simples é uma variável de sinalizador compartilhado:
int should_wait = 1;
void *Thread1(void *args)
{
pthread_mutex_lock(&mutex);
while (should_wait)
pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);
}
void *Thread2(void *args){
pthread_mutex_lock(&mutex);
should_wait = 0;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}