2016-07-11 13 views
-1

Ich suche nach Pthread auf C. So bin ich neu. Ich versuche, Syntax und Rollen von Zeigern in Pthread-Code zu lernen. Kann mir jemand sagen, was sind meine Fehler nach Code? Ich kann nicht klar verstehen, was ich getan habe.Pthread-Bibliothek grundlegendes Beispiel funktioniert nicht richtig

Wenn ich versuche, den Rückgabewert pthread_create() zu überprüfen, bekomme ich falsche/zufällige Werte.

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 

int *f_1,*f_2,*f_3,*f_4; 

void p1(void *a); 
void p2(void *a); 
void p3(void *a); 
void p4(void *a); 

int main(void){ 
pthread_t thread_1, thread_2, thread_3, thread_4; 
int *x=1,*y=2,*z=3,*w=4; 

f_1=pthread_create(&thread_1, NULL, p1,(void *)x); 
f_2=pthread_create(&thread_2, NULL, p2,(void *) y); 
f_3=pthread_create(&thread_3, NULL, p1,(void *) z); 
f_4=pthread_create(&thread_4, NULL, p1,(void *) w); 

pthread_join(thread_1,NULL); 
pthread_join(thread_2,NULL); 
pthread_join(thread_3,NULL); 
pthread_join(thread_4,NULL); 


printf("Hi! From %d. thread!",f_1); 
printf("Hi! From %d. thread!",f_2); 
printf("Hi! From %d. thread!",f_3); 
printf("Hi! From %d. thread!",f_4); 

return 0; 
} 
void p1(void *a){ 
f_1=(int *)a; 
} 

void p2(void *a){ 
f_2=(int *)a; 
} 

void p3(void *a){ 
f_3=(int *)a; 
} 

void p4(void *a){ 
f_4=(int *)a; 
} 
+0

'Ich kann nicht verstehen, klar, was ich getan habe. Frage: Wie hast du es dann gemacht? –

+0

Kannst du zumindest erklären, was du * versucht * zu tun hast und welche * spezifischen * Probleme du mit diesem Code hast? –

+0

Von einigen Websites, aber es wurde nicht kompiliert. – QatarNotAlone

Antwort

0

pthread_create() gibt ein int, Sie versuchen, dass speichern in einem int * (Zeiger). Das ist ein implementierungsdefiniertes Verhalten.

f_1=pthread_create(&thread_1, NULL, p1,(void *)x); 
f_2=pthread_create(&thread_2, NULL, p2,(void *) y); 
f_3=pthread_create(&thread_3, NULL, p1,(void *) z); 
f_4=pthread_create(&thread_4, NULL, p1,(void *) w); 

Als nächstes Sie verwenden %d Zeiger zu drucken,

printf("Hi! From %d. thread!",f_1); 
printf("Hi! From %d. thread!",f_2); 
printf("Hi! From %d. thread!",f_3); 
printf("Hi! From %d. thread!",f_4); 

die undefined behavior aufruft.

Um beide oben genannten Probleme zu lösen, sollten alle Ihre f_n Variablen int Typ sein, nicht int * s.

dass die Funktion Prototyp für Thread Funktionen gesagt,

void *(*start_routine) (void *) 

die eine Funktion void * ist und zur Annahme einer void * zurückkehrt. Vielleicht möchten Sie danach die Funktionssignatur und die Definition Ihrer Thread-Funktionen ändern.

+0

Sie sagen, dass ich Wert von Sub-Funktionen, mit einem pthread_create() nicht zurückgeben kann? – QatarNotAlone

+0

@outSider Ich spreche über den Rückgabewert von 'pthread_create()' Funktionsaufruf selbst, siehe die verknüpfte man-Seite. –

+0

ok, ich werde jetzt versuchen. – QatarNotAlone