参数在pthread中被错误地传递了

我写了一个代码来使用pthread打印出string:“线程0”到“线程4”。

这是我的代码:

情况1:

#include <stdio.h> #include <stdlib.h> #include <pthread.h> void *print_message_function(void* parameter) { long *i = (long *)parameter; printf("Thread %ld\n", *i); pthread_exit(0); } int main(int argc, char *argv[]) { pthread_t threads[5]; long i = 0; for (i = 0; i < 5; i++) { pthread_create(&threads[i], 0, print_message_function, (void *)&i); } pthread_exit(NULL); } 

但结果是:

 Thread 2 Thread 3 Thread 3 Thread 4 Thread 5 

要么:

 Thread 0 Thread 0 Thread 0 Thread 0 Thread 0 

当我再次运行它时,它改变了。 所以我不知道为什么我通过的值是(2到5)或全部(0)或…..(很多情况下)。 我想我通过的论点是从0到4。

案例2:

当我改变到新的代码:

 #include <stdio.h> #include <stdlib.h> #include <pthread.h> void *print_message_function(void *parameter); int main(int argc, char *argv[]) { pthread_t threads[5]; int i = 0; for (i = 0; i < 5; i++) { char *msg = (char*)malloc(sizeof(char)); sprintf(msg, "Thread %d", i); pthread_create(&threads[i], 0, print_message_function, (void *)msg); } } void *print_message_function(void *parameter) { printf("%s\n", (char *)parameter); } 

结果是:

 Thread 1 Thread 0 Thread 3 Thread 2 Thread 4 Thread 4 

这意味着循环运行6次! 为什么?

案例1更改为:

 #include <stdio.h> #include <stdlib.h> #include <pthread.h> void *print_message_function(void* parameter) { long i = (long)parameter; // <<< printf("Thread %ld\n", i); // <<< pthread_exit(0); } int main(int argc, char *argv[]) { pthread_t threads[5]; long i = 0; for (i = 0; i < 5; i++) { pthread_create(&threads[i], 0, print_message_function, (void *)i); // <<< } pthread_exit(NULL); } 

之前看到不一致结果的原因是因为您正在将指针传递给每个线程,其中每个指针都指向同一个局部变量,然后您正在修改该局部变量。

第二种情况下,你只需要一个字符,然后试着写一个字符串给它。 这应该是相当容易解决。

您的情况2方法是有效的,但是您需要修复malloc部分分配足够的字节。 将其更改为

 char *msg = (char*)malloc(sizeof(char) * (strlen("Thread ") + 10)); // assuming i will take at most 9-digits (unlikely case) 

你的情况1 ,你通过i地址。 但是当i试图打印的时候, i正在改变线程函数的值会得到那个位置的任何值。 还要注意的是,当线程函数执行时, i地址可能不是有效的,因为当它在堆栈上分配时, main函数返回时会消失。