Per comprendere il codice delle variabili di condizione pthread, ho scritto la mia versione. Sembra corretto? Lo sto usando in un programma, funziona, ma funziona sorprendentemente molto più velocemente. Originariamente il programma impiega circa 2,5 secondi e con la mia versione di variabili di condizione ci vogliono solo 0,8 secondi e anche l'output del programma è corretto. Tuttavia, non sono sicuro, se la mia implementazione è corretta.Implementazione delle variabili di condizione
struct cond_node_t
{
sem_t s;
cond_node_t * next;
};
struct cond_t
{
cond_node_t * q; // Linked List
pthread_mutex_t qm; // Lock for the Linked List
};
int my_pthread_cond_init(cond_t * cond)
{
cond->q = NULL;
pthread_mutex_init(&(cond->qm), NULL);
}
int my_pthread_cond_wait(cond_t* cond, pthread_mutex_t* mutex)
{
cond_node_t * self;
pthread_mutex_lock(&(cond->qm));
self = (cond_node_t*)calloc(1, sizeof(cond_node_t));
self->next = cond->q;
cond->q = self;
sem_init(&self->s, 0, 0);
pthread_mutex_unlock(&(cond->qm));
pthread_mutex_unlock(mutex);
sem_wait(&self->s);
free(self); // Free the node
pthread_mutex_lock(mutex);
}
int my_pthread_cond_signal(cond_t * cond)
{
pthread_mutex_lock(&(cond->qm));
if (cond->q != NULL)
{
sem_post(&(cond->q->s));
cond->q = cond->q->next;
}
pthread_mutex_unlock(&(cond->qm));
}
int my_pthread_cond_broadcast(cond_t * cond)
{
pthread_mutex_lock(&(cond->qm));
while (cond->q != NULL)
{
sem_post(&(cond->q->s));
cond->q = cond->q->next;
}
pthread_mutex_unlock(&(cond->qm));
}
Stai liberando il nodo 'self' senza rimuoverlo dalla lista. –
@ n.m. Il nodo 'self' viene rimosso da' signal' e 'broadcast'. –
@JensGustedt sì, mio male –