我试图理解线程是如何工作的。我有一些学校的例子。在这一个中,我必须弄清楚为什么这段代码无法正常工作。它的输出是这样的: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
中的第四个参数只是(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);
}