C 多线程上的混淆
我有一个多线程程序,但我不能理解它的运行结果C 多线程上的混淆,c,multithreading,C,Multithreading,我有一个多线程程序,但我不能理解它的运行结果 #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
#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;
}
#包括
#包括
#包括
#包括
无效*测试(无效*参数){
int num=*(int*)参数;
printf(“num的值:%d位于%p\n”,num,args);
pthread_exit(“exit”);
返回NULL;
}
int main()
{
int i,呃;
无效*rest;
int THREAD_NUM=2;
pthread_t child[THREAD_NUM];
对于(i=0;i
编译程序后,我们得到如下结果:
正在0xbf99f628处创建线程0
正在0xbf99f628处创建线程1
连接线程0
0xbf99f628处num:0的值
0xbf99f628处num:0的值
退出时返回字符串
连接线程1
退出时返回字符串
主要功能
我不知道为什么两个子线程的num值都是0。
在我看来,至少应该为一个子线程获取值1,因为我已经在父线程中将该值设置为1
每个线程都接收到循环修改的相同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]);
在创建两个线程之后,在第二个for循环的初始化过程中,i再次被设置为0。
使用其他变量(int j)进行第二次循环 C中没有闭包,这里只有一个堆栈变量
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]);