2017-10-27 2 views
0
#include <pthread.h> 
#include <cstdio> 

void *printa(void *) { 
    printf("a"); 
    return NULL; 
} 

void *printb(void *) { 
    printf("b"); 
    return NULL; 
} 

int main() { 
    pthread_t pa, pb; 
    pthread_create(&pa, NULL, printa, NULL); 
    pthread_create(&pb, NULL, printb, NULL); 
    for(;;); 
} 

Ich erwarte, dass es "a" und "b" in beliebiger Reihenfolge druckt, aber es kann laufen und verlassen, ohne etwas zu drucken. Warum? ADD: Der Grund ist der Hauptfunktions-Exit, bevor die Threads ausgeführt wurden. Also füge ich ein für (;;); am ende von main, und es scheint, dass "a" und "b" nie gedruckt wird.Warum dieses Stück Code ohne Ausgabe laufen (über Pthread)?

Antwort

2

Ihr Programm beendet, bevor Threads Verarbeitung fertig ist, müssen Sie warten, jeder Thread mit pthread_join

+1

... oder ein anderer Mechanismus, der eine vorzeitige Beendigung des Prozesses verhindert. –

1

printf (eigentlich stdout) im Allgemeinen Linie gepuffert zu beenden. Siehe printf(3) und setvbuf(3) und stdio(3). So sind die "a" und "b" Saiten im internen Puffer von stdout bleiben und Sie beobachten keine Ausgabe ...

Entweder ein \n in Ihrem printf hinzuzufügen, oder rufen Sie fflush(3) (vielleicht als fflush(NULL); ....) in beide printa und printb. Siehe auch flockfile(3).

Und Sie sollten pthread_join(3) sowohl pa und pb in Ihrem main nach den Anrufen zu pthread_create nennen, oder haben andere Fäden abgelöst z.B. mit pthread_detach(3). Siehe auch this.

Lesen Sie einige gute Pthread tutorial. Siehe auch pthreads(7).

BTW, die busy loop for(;;); ist schlechten Geschmack (und nicht umweltfreundlich: Sie verschwenden Energie nutzlos). Bevorzugen Sie eine Leerlaufschleife, vielleicht mit sleep(3), nanosleep(2), pause(2), usw .; oder einige event loop (um poll(2), etc ...). Natürlich wird ein Anruf an pthread_join warten, bis der Thread zu beenden.

Verwandte Themen