我有一个多线程程序,但我无法理解它的运行结果。
#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
void *test(void *args){
int num = *(int*)args;
printf("the value of num: %d at %p\n", num, args);
pthread_exit("exit");
return NULL;
}
int main ()
{
int i, err;
void * reStr;
int THREAD_NUM = 2;
pthread_t child[THREAD_NUM];
for(i = 0; i < THREAD_NUM; i++) {
printf("Creating thread %d at %p\n", i, &i);
err = pthread_create(&child[i], NULL, test, (void *)&i);
if(err) {
printf("Can't create thread %d\n", i);
return 0;
}
}
for(i = 0; i < THREAD_NUM; i++) {
printf("Join thread %d\n", i);
err = pthread_join(child[i], &reStr);
if(err) {
printf("Can't join thread %d\n", i);
return 0;
}
else{
printf("Returned string at %s\n", (char*)reStr);
}
}
printf("Main Function\n");
return 0;
}
编译程序后,我们得到如下结果:
在0xbf99f628
创建线程0在0xbf99f628
创建线程1加入主题0
在0xbf99f628
处的num:0的值在0xbf99f628
处的num:0的值退出时退回的字符串
加入主题1
退出时退回的字符串
主要功能
我不知道为什么我得到两个子线程的num值为0。 在我看来,我应该为至少一个子线程获取值1,因为我在父线程中将值设置为1。
答案 0 :(得分:1)
在创建两个线程之后,在第二个for循环的初始化期间,我再次被设置为0。 使用其他变量(int j)进行第二次循环。
答案 1 :(得分:0)
pthread_create(&child[i], NULL, test, (void *)&i);
您的每个线程都在接收您的循环修改的相同i
的地址。由于未指定线程的执行顺序,因此 时,每个线程都会在此处读取i
:
int num = *(int*)args;
可能会立即发生,或者在完成第一个循环并在第二个循环中将i
重置为零后,因此两个线程都会看到0。
如果您希望每个线程都读取自己的唯一值,则需要确保每个线程都指向不同的数据。您可以通过以下微小更改来完成它:
pthread_t child[THREAD_NUM];
int child_data[THREAD_NUM];
...
child_data[i] = i;
err = pthread_create(&child[i], NULL, test, &child_data[i]);