Para comprender el código de las variables de condición pthread, he escrito mi propia versión. ¿Se ve correcto? Lo estoy usando en un programa, está funcionando, pero funciona sorprendentemente mucho más rápido. Originalmente el programa toma alrededor de 2.5 segundos y con mi versión de las variables de condición solo toma 0.8 segundos, y la salida del programa también es correcta. Sin embargo, no estoy seguro, si mi implementación es correcta.Implementación de las variables de condición
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));
}
Está liberando el nodo 'self' sin eliminarlo de la lista. –
@ n.m. El nodo 'self' es sacado por' signal' y 'broadcast'. –
@JensGustedt sí, mi mala –