Um den Code der PThread-Zustandsvariablen zu verstehen, habe ich meine eigene Version geschrieben. Sieht es richtig aus? Ich benutze es in einem Programm, es funktioniert, aber es funktioniert überraschend viel schneller. Ursprünglich dauert das Programm etwa 2,5 Sekunden und mit meiner Version der Zustandsvariablen dauert es nur 0,8 Sekunden, und die Ausgabe des Programms ist auch korrekt. Ich bin mir jedoch nicht sicher, ob meine Implementierung korrekt ist.Implementierung der Zustandsvariablen
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));
}
Sie befreien den Knoten "self", ohne ihn aus der Liste zu entfernen. –
@ n.m. Der "self" -Knoten wird durch "signal" und "broadcast" entfernt. –
@JensGustedt ja, mein Schlechter –