2011-12-23 3 views
0

Когда я запускаю этот код, я получаю сообщения потоков точно в обратном порядке. Если я создам потоки A и B, то msg для A должен быть первым, а затем B. Аналогичным образом, если я создаю массив из 10 потоков, msg должен печатать в последовательности. Если какая-либо проблема синхронизации была там, то msg не должен показывать одинаковое обратное поведение во всех случаях.Почему потоки msg поступают в обратном порядке?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
/* Required for thread APIs */ 
#include <pthread.h> 

#define NTHREADS  10 
int counter = 0; 
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 

void *print_thread_msg(void *ptr){ 
     char *message; 
     printf("Thread number %ld\n", pthread_self()); 
     pthread_mutex_lock(&mutex); 
     counter++; 
     printf("Counter value: %d\n",counter); 
     message = (char *) ptr; 
     printf("%s \n",message); 
     sleep(1); 
     pthread_mutex_unlock(&mutex); 
     message = (char *) ptr; 
     printf("%s \n",message); 
} 

int main (void){ 
     pthread_t threadA, threadB; 
     pthread_t thread_id[NTHREADS]; 

     int i,j; 

     char *msgA = "I am thread A"; 
     char *msgB = "I am thread B"; 

     pthread_create(&threadA, NULL, print_thread_msg, (void *)msgA); 
     pthread_create(&threadB, NULL, print_thread_msg, (void *)msgB); 

     for(i=0; i<NTHREADS; i++) 
       pthread_create(&thread_id[i], NULL, print_thread_msg, (void *)"print_thread_msg"); 

     pthread_join(threadA, NULL); 
     pthread_join(threadB, NULL); 

     for(j=0; j < NTHREADS; j++) 
       pthread_join(thread_id[j], NULL); 

     printf(" Finally Counter Value : %d\n",counter); 

     exit(0); 
} 
+0

Здесь нет ничего плохого. Это ожидаемое поведение, потому что потоки являются неопределенными, и вы находитесь во власти планировщика. Вы не можете предсказать, когда они будут запускаться или заказать. Когда я запустил ваш pgm 5 из ваших десяти потоков «print_thread_msg», запущенных до того, как либо A, либо B. Это может быть разным при каждом запуске. – Duck

+0

Я думаю, что ты прав. когда я запускаю ту же программу в другой системе, она печатает правильно. – 0x07FC

ответ

0

Ваш код работает правильно для меня. Я пробовал с 3 потоками. Он всегда начинается с нитки A, а остальные os-нитки следуют случайным образом. Вы пытались запустить код в другой системе?

+0

Да, я попробовал его в другой системе, и он печатает в правильном порядке, но я все еще не могу понять, почему в обратном порядке. Это может быть случайный отпечаток. Даже если я продолжу добавлять новый поток, последний будет первым. – 0x07FC

Смежные вопросы