2011-12-23 55 views
0

當我運行這段代碼時,我完全按照相反的順序得到線程消息。如果我創建線程A和B,則A的msg應該先出現,然後是B.同樣,如果我創建了10個線程的數組,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

這裏沒有錯。這是預期的行爲,因爲線程是不確定的,並且你處於調度程序的擺佈之中。你無法預測他們何時會跑步或下單。當我運行10個「print_thread_msg」中的第5個pgm時,線程在A或B之前運行。它可能在每次運行時都不同。 – Duck 2011-12-23 06:12:48

+0

我認爲你是對的。當我在其他系統上運行相同的程序時,它可以正確打印。 – 0x07FC 2011-12-25 18:28:33

回答

0

您的代碼爲我正確運行。我嘗試了3個線程。它總是以線程A開始,其餘線程隨機隨機。您是否嘗試在其他系統中運行代碼?

+0

是的,我在其他系統上嘗試過,並且按照正確的順序打印,但我仍然無法弄清楚,爲什麼按相反的順序。這可以是隨機打印。即使我不斷添加新線程,最後一個也是第一個。 – 0x07FC 2011-12-25 18:27:33