All*_*ang 1 c concurrency multithreading 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;
}
Run Code Online (Sandbox Code Playgroud)
坏的例子是
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void *get_rand_num(void *args) {
int num;
srand(pthread_self());
num = rand();
return #
}
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;
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以理解这两个例子,请向我解释为什么坏的一个与第一个不同,为什么它不好?
谢谢
allan
坏示例返回指向局部变量的指针.这总是一个坏主意,因为局部变量在函数返回时死亡.这不是特定于多线程程序的问题,但是因为线程在每个线程中获得一个堆栈而加剧,这在之后被释放pthread_join.虽然你经常在单线程编程中很幸运,并且可以在函数返回后立即使用指针,但是包含旧线程堆栈的整个段可能已经回到操作系统中,并且访问会产生分段错误.
第一个例子也不是很好,因为它会产生内存泄漏.