Di seguito è riportato un programma che utilizza pthreads.Output imprevisto in un programma con multithreading
#include <pthread.h> // posix threads
#include <stdio.h>
#include <stdlib.h>
/* to compile use -lpthread */
void * sample_thread(void *);
#define MAX 10
int main()
{
pthread_t tid;
pthread_attr_t attr;
int k;
pthread_attr_init(&attr); // set default attributes
pthread_create(&tid, &attr, sample_thread, NULL); // create new thread
// sample_thread will run as the new thread
for(k=0; k<MAX; k++) {
printf("Hi I'am %s %d \n",__func__,k);
}
//this would kill all the threads,
}
void * sample_thread(void * p)
{
int k;
for(k=0; k<MAX; k++) {
printf("Hi I'am %s %d \n",__func__,k);
}
}
Ogni volta quando si esegue il programma mi aspetto di ottenere il numero diverso di numeri di esecuzione dal thread principale e il thread figlio (perché la principale uscita filo forza prima che il bambino). A volte sto ottenendo questo risultato atteso. Ma ho ottenuto un risultato come segue, che non riesco a capire perché.
Hi I'am main 0
Hi I'am main 1
Hi I'am main 2
Hi I'am main 3
Hi I'am main 4
Hi I'am main 5
Hi I'am main 6
Hi I'am main 7
Hi I'am main 8
Hi I'am main 9
Hi I'am sample_thread 0
Hi I'am sample_thread 0
Hi I'am sample_thread 1
Hi I'am sample_thread 2
Hi I'am sample_thread 3
Hi I'am sample_thread 4
Hi I'am sample_thread 4
Hi I'am sample_thread 5
Perché il filo di prova 0 e 4 sono stati stampati due volte?
Puoi dirci quale sistema operativo stai utilizzando? Non sembra che ci sia qualcosa di sbagliato nel tuo programma e ho il sospetto che potrebbe essere un bug nell'implementazione ('exit 'è richiesto da POSIX per sincronizzarsi con le operazioni stdio, ma se non lo fa, potrebbero esserci razze di dati (e la corruzione casuale) quando scarica lo 'stdout' simultaneamente con un altro thread che scrive su' stdout'). –
È Ubuntu 13.10 – DesirePRG