pthread_create を使用して 5 つのスレッドを作成しました。これらのスレッドをバックグラウンドで実行したいので、これらのスレッドには参加しませんでした。しかし、プログラムは奇妙な出力を生成しています。これらの理由は何ですか?
プログラム:
for(i = 0; i < 5; i++)
{
pthread_create(&thread[i], NULL, func, &i)
}
pthread_create を使用して 5 つのスレッドを作成しました。これらのスレッドをバックグラウンドで実行したいので、これらのスレッドには参加しませんでした。しかし、プログラムは奇妙な出力を生成しています。これらの理由は何ですか?
プログラム:
for(i = 0; i < 5; i++)
{
pthread_create(&thread[i], NULL, func, &i)
}
考えられる理由の 1 つi
は、スレッドへの引数としてポインターを渡し、そのポインターがすべてのスレッドで同じになることです。したがって、ループの後、すべてのスレッドi
が5
対象になります。
ポインターを渡す代わりに、正しい型キャストを使用して、実際の値をポインターとして渡すことができます。
pthread_create(&thread[i], NULL, func, (void *) i);
そしてスレッド関数で:
void *func(void *thread_argument)
{
int i = (int) thread_argument;
/* ... */
}