多线程上的困惑

时间:2017-03-21 08:01:45

标签: 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");
 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。

enter image description here

2 个答案:

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