スレッドの仕組みを理解しようとしています。私は学校からいくつかの例を持っています。このコードでは、なぜこのコードが適切に動作しないのかを理解する必要があります。その出力は次のとおりです。C言語のPOSIXスレッド
Main: Creating thread 0
Main: Creating thread 1
Main: Creating thread 2
Main: Creating thread 3
Main: Creating thread 4
Main: Creating thread 5
Main: Creating thread 6
Main: Creating thread 7
Main: Creating thread 8
Thread 0: English: Hello World!
Thread 0: English: Hello World!
Thread 0: English: Hello World!
Thread 0: English: Hello World!
Thread 0: English: Hello World!
Thread 0: English: Hello World!
Thread 0: English: Hello World!
Thread 0: English: Hello World!
Thread 0: English: Hello World!
しかし、すべてのスレッドは別の言語で 'Hello World'と言うべきです。ここに私のコードです。関数pthread_create
の4番目のパラメータがポインタの代わりに(void *) t
になったときに正常に動作します。しかし、私は正しいソリューションが(void *) &t
であることを知っています。おそらく私はいくつかのポインタの問題を扱っていますが、私はちょうど
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define NUM_THREADS 8
char *messages[NUM_THREADS + 1] =
{
"English: Hello World!",
"French: Bonjour, le monde!",
"Spanish: Hola al mundo",
"Klingon: Nuq neH!",
"German: Guten Tag, Welt!",
"Russian: Zdravstvytye, mir!",
"Japan: Sekai e konnichiwa!",
"Latin: Orbis, te saluto!",
"Cesky: Ahoj svete!"
};
void * helloThread (void * threadid)
{
int *id_ptr, taskid;
sleep(1);
id_ptr = (int *) threadid;
taskid = *id_ptr;
printf("Thread %d: %s\n", taskid, messages[taskid]);
return(NULL);
}
int main(int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc, t;
for(t=0;t<=NUM_THREADS;t++) {
printf("Main: Creating thread %d\n", t);
rc = pthread_create(&threads[t], NULL, helloThread, (void *) &t);
if (rc) {
printf("ERROR; return code from pthread_create() is %d\n", rc);
return (EXIT_FAILURE);
}
}
pthread_exit(NULL);
return (0);
}