呼び出しでi
各スレッドにのアドレスを渡すと、各スレッドが変数でどのような値を参照するかについての保証はありません。pthread_create()
スレッド 0 が 2 や 3 などの値を参照する可能性があります。これはi
、 が呼び出されたときに 0 だったとしてもpthread_create()
、スレッドが実行されて変数を読み取るまでに、値がメイン スレッドによって変更されているためです。
たとえば、コードを少し変更したこのバージョンでは、次のような出力が得られました。
Hello world from thread 3
Hello world from thread 4
Hello world from thread 4
Hello world from thread 3
Hello world from thread 5
Hello world from thread 5
Hello world from thread 5
...
Hello world from thread 5
Hello world from thread 5
Hello world from thread 5
Main over and out
変更されたコード:
削除され、と<math.h>
の繰り返し。変数を削除しました。期待されるものと一致するようにスレッド関数のタイプを修正しました。<stdio.h>
<pthread.h>
thread_no
pthread_create()
#include <pthread.h>
#include <stdio.h>
#define NO_OF_THREADS 5
void *print_function(void *ip);
void *print_function(void *ip)
{
int *i = ip;
int count;
for(count=0; count<10; count++)
printf("Hello world from thread %d\n",*i);
pthread_exit(NULL);
return 0;
}
int main(void)
{
pthread_t printThreads[NO_OF_THREADS];
int i;
for(i=0; i<NO_OF_THREADS; i++)
{
pthread_create(&printThreads[i], NULL, print_function,&i);
}
int j;
for(j=0;j<NO_OF_THREADS;j++)
pthread_join(printThreads[j],NULL);
puts("Main over and out");
return 0;
}
pthread_self()
と同様に印刷するようにコードを修正すると*i
、出力が得られました。
0x10800f000: Hello world from thread 1
0x10800f000: Hello world from thread 4
0x10800f000: Hello world from thread 5
0x10800f000: Hello world from thread 5
0x10800f000: Hello world from thread 5
0x10800f000: Hello world from thread 5
0x10800f000: Hello world from thread 5
0x10800f000: Hello world from thread 5
0x10800f000: Hello world from thread 5
0x10800f000: Hello world from thread 5
0x108092000: Hello world from thread 5
0x108115000: Hello world from thread 5
0x108198000: Hello world from thread 5
0x10821b000: Hello world from thread 5
スレッドのうち 4 つは、値 5 しか認識していません。そのうちの 1 つ (おそらく「スレッド 0」) も値 1 と 4 を認識しました。動作も非決定論的です。別の実行の開始は次のとおりです。
0x10432b000: Hello world from thread 3
0x1043ae000: Hello world from thread 4
0x104431000: Hello world from thread 4
0x1044b4000: Hello world from thread 4
0x104537000: Hello world from thread 5
0x10432b000: Hello world from thread 5
0x1043ae000: Hello world from thread 5
どちらの場合も、残りのエントリはさまざまなスレッドのエコー5
でした。