このコードを実行すると、スレッドメッセージが正確に逆の順序で取得されます。スレッド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);
}
ここに何も問題はありません。これは、スレッドが不確定で、スケジューラの恩恵を受けているため、予想される動作です。それらがいつ実行されるか、または注文を予測することはできません。私があなたのpgmを実行したとき、あなたの10の「print_thread_msg」スレッドのうち5つがAまたはBの前に実行されました。実行ごとに異なる可能性があります。 – Duck
あなたは正しいと思います。他のシステムで同じプログラムを実行すると、正しく印刷されます。 – 0x07FC