C程序并发与pthread




我正在复习教授的课堂笔记。当我到达并发部分时,我得到了这个问题:在幻灯片中,教授举了两个使用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: %dn", * (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: %dn", * (int *) ptr); 
  return 0; 
}

谁能理解这两个例子,请给我解释一下为什么坏的一个不同于第一个,为什么不好?


谢谢
艾伦

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

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

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

糟糕的情况是返回一个指向堆栈的指针——就像一只很久以前飞出窗外的鸟!

但是如果它工作-你将有一个非常非常随机的数字-比用线程的id设置随机数生成器要好一点!

最新更新