I used streams in this code. but when I execute this code in the shell, some threads did not print this line.
printf("\ti'm %dth thread:)", j); printf("\t%c %d %d %d \n", arr[j].op, arr[j].byte, seq, no_file);
In addition, even some threads print this line twice. what happened to this process? And how to reorganize this code so that threads print a line exactly once?
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <sys/stat.h> #include <unistd.h> #include <string.h> #include <pthread.h> #include <errno.h> typedef struct {char op; int byte; int seq; int no_file; } ARRAY; ARRAY *arr; void *thread_operation(void *arg){ int j =*((int*)arg); seq = arr[j].seq; int no_file = arr[j].no_file; printf("\ti'm %dth thread:)", j); printf("\t%c %d %d %d \n", arr[j].op, arr[j].byte, seq, no_file); } int main() { int err, j, i = 10; long int tid; arr = (ARRAY*)malloc(sizeof(ARRAY) * i); srand(time(NULL)); for (i = 0; i <= 10; i++){ arr[i].op = 'r'; arr[i].byte = (rand() % 10); arr[i].seq = i; arr[i].no_file = i + 10; } for(j = 0; j < 10; j++){ printf("creating %dth thread.....", j); err = pthread_create(&tid, NULL, thread_operation, &j); if(err != 0) printf("%s\n", strerror(err)); printf("%dth done\n", j); } return 0; }
This is the result of my computer.
creating 0th thread.....0th done creating 1th thread..... i'm 0th thread:) r 9 0 10 1th done creating 2th thread..... i'm 2th thread:) r 3 2 12 i'm 2th thread:) r 3 2 12 2th done creating 3th thread..... i'm 3th thread:) r 6 3 13 3th done creating 4th thread..... i'm 4th thread:) r 9 4 14 4th done creating 5th thread..... i'm 5th thread:) r 3 5 15 5th done creating 6th thread..... i'm 6th thread:) r 2 6 16 6th done creating 7th thread..... i'm 7th thread:) r 2 7 17 7th done creating 8th thread.....8th done creating 9th thread..... i'm 8th thread:) r 6 8 18 9th done i'm 9th thread:) r 8 9 19 i'm 9th thread:) r 8 9 19
source share