2011-12-23 8 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

ここに何も問題はありません。これは、スレッドが不確定で、スケジューラの恩恵を受けているため、予想される動作です。それらがいつ実行されるか、または注文を予測することはできません。私があなたのpgmを実行したとき、あなたの10の「print_thread_msg」スレッドのうち5つがAまたはBの前に実行されました。実行ごとに異なる可能性があります。 – Duck

+0

あなたは正しいと思います。他のシステムで同じプログラムを実行すると、正しく印刷されます。 – 0x07FC

答えて

0

あなたのコードは正しく動作します。私は3つのスレッドで試しました。常にスレッドAから始まり、残りのスレッドはスレッドをランダムにたどります。他のシステムでコードを実行しようとしましたか?

+0

はい、私は他のシステムでそれを試して、それは正しい順序で印刷しますが、私はまだ理解できません、なぜ逆の順序で。これはランダムプリントである可能性があります。私が新しいスレッドを追加しても、最後のスレッドが最初に来ます。 – 0x07FC

関連する問題