Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 多线程上的混淆_C_Multithreading - Fatal编程技术网

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]);