Es ist ein Jahr oder so seit ich mit pthreads
aus einem OS-Klasse gespielt habe und ich habe versucht, nur zum Spaß zurück in es zu bekommen. Unten ist der Code für meine einfache Threading-Übung, die ich von online source durchlaufen habe. Meine Sorge ist, dass das Tutorial sagt, dass die ausgegeben werden soll:Aufrufen von Threads vor dem Drucken noch Drucken wird vor Threads ausgeführt
Thread 1
Thread 2
pthread_create() for thread 1 returns: 0
pthread_create() for thread 2 returns: 0
, die für mich Sinn macht. Aber ich bin immer
pthread_create() for thread 1 returns: 0
pthread_create() for thread 2 returns: 0
Thread 1
Thread 2
pthread1.c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void *print_message_function(void *ptr);
main()
{
pthread_t thread1, thread2;
const char *message1 = "Thread 1";
const char *message2 = "Thread 2";
int iret1, iret2;
iret1 = pthread_create(&thread1, NULL, print_message_function, (void*) message1);
if(iret1)
{
fprintf(stderr,"Error - pthread_create() return code: %d\n",iret1);
exit(EXIT_FAILURE);
}
iret2 = pthread_create(&thread2, NULL, print_message_function, (void*) message2);
if(iret2)
{
fprintf(stderr,"Error - pthread_create() return code: %d\n",iret2);
exit(EXIT_FAILURE);
}
printf("pthread_create() for thread 1 returns: %d\n",iret1);
printf("pthread_create() for thread 2 returns: %d\n",iret2);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
exit(EXIT_SUCCESS);
void *print_message_function(void *ptr)
{
char *message;
message = (char *) ptr;
printf("%s \n", message);
}
Es sieht so aus, als ob Ihr Tutorial falsch ist. Nachrichten können in beliebiger Reihenfolge oder sogar in Intervallen angezeigt werden. –
Der neue Thread kann, aber nicht immer, vor der Rückgabe von pthread_create() ausgeführt werden. Sie können also die Kontrolle in main() zurückholen, bevor jeder Thread beginnt oder danach. Diese Unvorhersagbarkeit bedeutet, dass die Anzeigeanweisungen in einer anderen Reihenfolge als die Textbuchantwort angezeigt werden können. –
der gepostete Code wird nicht sauber kompiliert! Aktivieren Sie beim Kompilieren immer alle Warnungen und beheben Sie diese Warnungen. (für 'gcc', bei minimaler Verwendung:' -Wall -Wextra -pedantic' verwende ich auch: '-Wconversion -std = gnu99') 1) es gibt nur zwei gültige Signaturen für die' main() 'Funktion:' int main (void) 'und' int main (int argc, char * argv []) 'Beachten Sie, dass beide den Rückgabetyp von' int' 2) haben. Der 'main()' -Funktion fehlt die abschließende geschweifte Klammer '}', 3) Die Funktion 'print_message_function()' hat einen Rückgabetyp von 'void *', aber es fehlt die eigentliche 'return'-Anweisung. – user3629249