C Threads und Beginner = Verständnis-Problem

WingMan81

Grünschnabel
Hallo alle zusammen,

nach langem zögern und zittern vor den ach so bösen Pointern habe ich mich nun doch entschlossen auch die Sprache C mal in Angriff zu nehmen. Siehe da es klappt sogar halbwegs ;)

Ich bin nun beim Thema Threads angelangt und habe dort ein Phänomen das ich mir selber nicht erklären kann. Wahrscheinlich ist es mal wieder ganz einfach wenn man es denn erklärt bekommt.
Also:

Soweit ich das verstanden habe:
pthread_create() erstellt und startet den Thred.
pthread_join() Wartet mit dem Main Thread auf Beendigung der anderen Threads wenn es denn nötig ist.

Ich habe mir nun folgendes gebastelt:
C:
int main()
{
	pthread_t t1, t2;
	
	createThread(&t1);
	createThread(&t2);
	
	pthread_join(t1, NULL);
	pthread_join(t2, NULL);
	return 0;
}

void createThread(pthread_t *p)
{
	static int counter = 0;

	if(counter%2 == 0)
		pthread_create(p, NULL, threadOne, NULL);
	else
		pthread_create(p, NULL, threadTwo, NULL);	
	
	counter++;	
}

void *threadOne()
{
	int i;
	for(i = 0; i < 200; i++)
		printf(" - ThreadOne %d", i);
	return NULL;
}

void *threadTwo()
{
	int i;
	for(i = 0; i < 100; i++)
		printf("ThreadTwo  %d", i);
	return NULL;
}

Wenn ich es so implementiere läuft alles wunderbar, sprich die Threads wechseln sich auch ab.

Nun zum Verständnis-Problem: Ziehe ich das pthread_join mit in die Funktion die die Thread startet, dann läuft erst der eine Thread bis zum Ende und erst dann beginnt der zweite Thread mit der Arbeit.
Also wenn es so aussieht:
C:
int main()
{
	pthread_t t1, t2;
	
	createThread(&t1);
	createThread(&t2);
	return 0;
}

void createThread(pthread_t *p)
{
	static int counter = 0;

	if(counter%2 == 0)
		pthread_create(p, NULL, threadOne, NULL);
	else
		pthread_create(p, NULL, threadTwo, NULL);	
	
	counter++;
        pthread_join(*p, NULL);
}

void *threadOne()
{
	int i;
	for(i = 0; i < 200; i++)
		printf(" - ThreadOne %d", i);
	return NULL;
}

void *threadTwo()
{
	int i;
	for(i = 0; i < 100; i++)
		printf("ThreadTwo  %d", i);
	return NULL;
}
Nun die ach so beliebte Frage: WIESO IST DAS SO?

Vielen Dank und viele Grüße,
WingMan

PS: Gibt es keine Code-Tags oder habe ich die übersehen?
 
Zuletzt bearbeitet:
PS: Gibt es keine Code-Tags oder habe ich die übersehen?

Moin und Willkommen,

doch, die gibt es: nimm' im Editor den Button mit der '#' oder schreibe händisch "[_CODE] ... [_/CODE]" (OHNE die Unterstriche) in Deinen Post!

Zu Deinem Problem kann ich Dir so aus dem Stand heraus nix sagen, zumal es wirklich schwer zu lesen ist :p

Gruß
Klaus
 
Hi.
Nun die ach so beliebte Frage: WIESO IST DAS SO?
Weil du es so programmiert hast. Und weil es logisch ist.

Schau dir doch an was du machst: du rufst im Hauptthread deiner Anwendung die createThread Funktion auf, startest einen Thread und gleich darauf wartest du mit pthread_join auf die Beendigung des Threads. Das heißt die Funktion createThread kehrt natürlich nicht zurück bevor der Thread nicht fertig abgearbeitet wurde.

Gruß

PS: Noch besser wäre es die passenden Code-Tags zu benutzen: [c]...[/c] für C-Code [code=cpp]...[/code] für C++ usw.
 
Ahhhhh,

ich hatte es so verstanden, das pthread_join() lediglich dafür eingesetzt wird damit nicht der "Main-Thread" beendet wird ohne das die anderen Threads zuvor beendet wurden. Ich hatte es nicht so verstanden das dann der Main-Thread beim join hängen bleibt!

Das ging wahnsinnig schnell mit den Antworten und direkt alles geklärt!

RESPEKT und vielen DANK! Aber: Ich kann euch schon jetzt verraten das da noch weitere dumme Fragen folgen werden ;)

Viele Grüße
WingMan

Nur so nebenbei: Mir fällt auch gerade auf das dies nun ein anderer Nachrichten-Editor ist als der den ich hatte beim erstellen des Threads... Da gab es nämlich keine Button wie "#" oder eine Möglichkeit die Schriftart zu ändern. Seltsam...
 
Nur so nebenbei: Mir fällt auch gerade auf das dies nun ein anderer Nachrichten-Editor ist als der den ich hatte beim erstellen des Threads... Da gab es nämlich keine Button wie "#" oder eine Möglichkeit die Schriftart zu ändern. Seltsam...

hmm ... was meinst mit "dies" :confused::confused:

Falls Du den Editor meinst, den Du über den "ÄNDERN"-Button aufrufst, dann ist dass leider allerdings so. Hier musst Du dann ggf. mit HTML-Tags arbeit, also bspw. [_b] und [_/b] für Fettschrift (wiederum ohne die Unterstriche).

Es gibt übrigens rechts neben dem '#'-Button auch eigene Button für HTML- und PHP-Code (!) Jedoch leider (noch :confused: :)) nicht für JAVA oder C/C++. Insoweit hat deepthroat mit seinem Hinweis völlig Recht !!

Gruß
Klaus
 
Oh, den Hinweis von Deepthroat mit den c-tags habe ich doch glatt überlesen :( Werde ich aber gleich noch ändern.

Mit *dies* war der Editor gemeint den ich sehe wenn ich auf Antworten klicke. In dem sind alle Möglichkeiten zum formatieren vorhanden. Beim Ändern bekam ich den gleichen Editor wie beim erstellen des Threads. Da konnte ich lediglich Text schreiben und unten ein Beitragssymbol auswählen.

Viele Grüße,
WingMan
 
:confused::confused::confused::confused: Habe es gerade auch nochmal ausprobiert. Wenn ich jetzt einen neuen Thread eröffne sehe ich auch den richtigen Editor :confused::confused::confused:
Seltsam, bin mir 100%ig sicher das das beim erstellen dieses Threads nicht der Fall war, da ich ja nach den Code-Tags gesucht habe. Naja, vielleicht mal wieder mein Firefox oder so, keine Ahnung!? Hauptsache nun klappts :)

Beim nächsten Thread werde ich direkt C-Tags verwenden, versprochen ;)
 
Zurück