• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

(hat sich erledigt)[C++] Threads

Andymann

Newbie
Hi!
ich wollte mich heute mit Linux und Threads mit Mutexen und condition variables beschäftigen und habe mir folgendens kleines Programm gebastetelt.
Ich wollte mit pthread_cond_broadcast() beide Threads gleichzeitig aufwecken, leider funktioniert das so nicht wie ich es mir gedacht habe.

Wenn jemand mal über den Code schauen könnte und mir erklären würde was ich da falsch gemacht habe wäre klasse.

C++
Code:
#include<iostream>
#include<pthread.h>
#include<errno.h>
using namespace std;

pthread_mutex_t threadMutex=PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t threadCond=PTHREAD_COND_INITIALIZER;

pthread_mutex_t mainMutex=PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t mainCond=PTHREAD_COND_INITIALIZER;
int i=0;

void *verbraucher1(void *nothing){

	if(i<20){
		cout << "[Thread1]: Warte bis Puffer gefüllt ist ..." << endl;
		pthread_cond_wait(&threadCond, &threadMutex);
	}
	while(true){
	if(i<=0){
		cout << " [Thread1]: Nichts mehr zu tun, wecke Main und gehe schlafen ..." << endl;
		pthread_cond_signal(&mainCond);
		pthread_cond_wait(&threadCond, &threadMutex);
	}
	cout << "[Thread1]: Verbrauche ... " << "neuer Zählerstand: " << --i << endl;
	sleep(1);
	}
}

void *verbraucher2(void *nothing){

	if(i<20){
		cout << "[Thread2]: Warte bis Puffer gefüllt ist ..." << endl;
		pthread_cond_wait(&threadCond, &threadMutex);
	}
	while(true){
	if(i<=0){
		cout << " [Thread2]: Nichts mehr zu tun, wecke Main und gehe schlafen ..." << endl;
		pthread_cond_signal(&mainCond);
		pthread_cond_wait(&threadCond, &threadMutex);
	}
	cout << "[Thread2]: Verbrauche ... " << "neuer Zählerstand: " << --i << endl;
	sleep(1);
	}
}

int main(void){
	pthread_t tid[2];
	 cout << "Erstelle Thread:" << endl;
	if(pthread_create(&tid[0], NULL, &verbraucher1, NULL)!=0  || pthread_create(&tid[1], NULL, &verbraucher2, NULL)!=0){
		cout << " Konnte Thread nicht erstellen, beende Programm" << endl;
		return 0;
		}
	
	while(true){
		if(i>=20){
			cout << "[Main]: Puffer voll (" << i << "), wecke Verbraucher und gehe schlafen..." << endl;
			//pthread_cond_signal(&threadCond);
			pthread_cond_broadcast(&threadCond);
			pthread_cond_wait(&mainCond, &mainMutex);
		}
		cout << "[Main]: Fülle Puffer auf, neuer Stand: " << ++i << endl;
		sleep(1);
	}
	return 0;
}
 
OP
A

Andymann

Newbie
OK hat sich erledigt, ich habe die Beschreibung der Funktion pthread_cond_broadcast() nur falsch verstanden.
Es läuft alles so wie es soll.
 
Oben