首页 > apue 多线程程序疑问

apue 多线程程序疑问

unix环境高级编程中有这么一段程序:

#include "apue.h"
#include "error.c"
#include <pthread.h>

typedef struct foo{
int a, b,c, d;
}Foo;

void printfoo( const char* s, const Foo* fp ){

printf(s);
printf("structrue at 0x%x\n", (unsigned)fp);
printf(" foo.a = %d\n", fp->a );
printf(" foo.b = %d\n", fp->b );
printf(" foo.c = %d\n", fp->c );
printf(" foo.d = %d\n", fp->d );
}

void * thr_fn1( void* arg ){
struct foo foo = {1, 2, 3, 4};
printfoo( "thread1 :\n", &foo);
pthread_exit( (void*)&foo);
}

void * thr_fn2( void* arg ){
printf( "thread2 : ID is %lu\n", pthread_self());
pthread_exit( (void*)0);
}

int main(void){
int err;
pthread_t tid1, tid2;
struct foo *fp;
err = pthread_create(&tid1, NULL, thr_fn1, NULL );

if( err != 0 ){
err_quit("can't create thread1:%s\n", strerror(err) );
}

err = pthread_join( tid1, (void*)&fp);

if( err != 0 ){
err_quit("can't create thread1:%s\n", strerror(err) );
}

sleep(1);
printf("parent starting second threads\n");
err = pthread_create( &tid2, NULL, thr_fn2, NULL );

if( err != 0 ){
err_quit("can't create thread2:%s\n", strerror(err) );
}

sleep(1);
printfoo("parent :\n", fp);
exit(0); 

}

我的运行结果:

thread1 :

structrue at 0xb75cb350
foo.a = 1
 foo.b = 2
foo.c = 3
 foo.d = 4
  parent starting second threads
  thread2 : ID is 3076307776
 parent :
 structrue at 0xb75cb350
   foo.a = 0
  foo.b = -1218659520
   foo.c = -1218659520
   foo.d = -1216925708

书上说的意思是主线程访问参数fp指向的结构时,它的内容已经改变了.我不明白的是线程1在自己的栈上分配了一个结构,和主线程中的fp有什么关系,主线程传递的fp还只是一个未初始化的指针,为什么在运行printfoo时没有出现运行时错误?这中间发生了什么?

多谢


主线程把fp的地址传递给了线程1(pthread_join( tid1, (void)&fp);),
线程1退出的时候,把线程1栈上分配的变量赋值给了fp(pthread_exit( (void
)&foo);),
然后线程2覆盖了,线程1栈上分配的变量,
主线程在打印fp时,出现了随机值。


关系就在这里

err = pthread_join( tid1, (void*)&fp);

这个题目想表达的也许是访问已经pthread_exit的线程的堆栈上的数据是未定义行为。主线程的fp和第一个线程的fp没有直接关系,处于两个不同的堆栈。但是pthread_exit,pthread_join
改变了主线程的fp值,使其指向线程一的曾经的堆栈上的地址,但是线程一又已经退出了,所以访问到的数据已经不是线程一初始过的内容

【热门文章】
【热门文章】