C程序与pthread的并发

时间:2011-12-14 18:37:20

标签: c multithreading concurrency pthreads


我正在用我教授的讲义进行评论。当我到达并发部分时,我收到了这个问题: 在幻灯片中,教授给出了两个使用pthread的例子(一个是很好的例子,另一个是坏的)。但我不明白为什么它们之间存在差异。
这是一个很好的例子:

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
void *get_rand_num(void *args) { 
  int *nump = malloc(sizeof(int)); 
  srand(pthread_self()); 
  *nump = rand(); 
  return nump; 
} 
int main() { 
  pthread_t tid; 
  void *ptr = NULL; 
  pthread_create(&tid, NULL, get_rand_num, NULL); 
  pthread_join(tid, &ptr); 
  printf("Random number: %d\n", * (int *) ptr); 
  return 0; 
}

坏的例子是

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
void *get_rand_num(void *args) { 
  int num; 
  srand(pthread_self()); 
  num = rand(); 
  return &num; 
} 
int main() { 
  pthread_t tid; 
  void *ptr = NULL; 
  pthread_create(&tid, NULL, get_rand_num, NULL); 
  pthread_join(tid, &ptr); 
  printf("Random number: %d\n", * (int *) ptr); 
  return 0; 
}

任何人都可以理解这两个例子,请向我解释为什么坏的与第一个不同,为什么它不好?


谢谢
艾伦

3 个答案:

答案 0 :(得分:5)

错误示例返回指向局部变量的指针。这总是一个坏主意,因为局部变量在函数返回时死亡。这对于多线程程序来说不是特定问题,但是由于线程在每个线程中获得一个堆栈(在pthread_join之后取消分配),因此更加严重。虽然你经常在单线程编程中幸运,并且可以在函数返回后立即使用指针,但是包含旧线程堆栈的整个段可能已经回到操作系统中,并且访问会产生分段错误。

第一个例子也不是很好,因为它会产生内存泄漏。

答案 1 :(得分:1)

在坏的情况下,返回&amp; num,其中num是堆栈上的局部变量,仅在函数范围内有效。一旦您返回,它就不再有效。

答案 2 :(得分:0)

坏情况会返回一个指向堆栈位的指针 - 就像很久以前飞出窗外的鸟一样!

但是如果它有效 - 你会有一个非常随机的数字 - 用线程的id来随机数字gerenrator来更好一点!