我编写了这段代码,以了解局部变量在线程中的工作原理。我从另一个线程创建它时将局部变量的地址传递给一个线程。原始线程退出后,当堆栈帧被销毁时,局部变量也会被破坏。那么新线程会发生什么?为什么没有分段错误?
#include<stdio.h>
#include<pthread.h>
#include<sys/types.h>
#include<fcntl.h>
#include<string.h>
#include<unistd.h>
pthread_t t1,t2;
pthread_mutex_t mtx=PTHREAD_MUTEX_INITIALIZER;
void* thr_fun2(void *p);
void* thr_fun1(void *p)
{
int data = 0;
sleep(1);
pthread_create(&t2,0,thr_fun2,&data);
printf("Thread 1 entered....\n");
while(1)
{
pthread_mutex_lock(&mtx);
if(data > 5)
pthread_exit(0);
printf("thread1:data =%d\n ",data);
data++;
sleep(1);
printf("thread1:data(inc) =%d\n ",data);
pthread_mutex_unlock(&mtx);
sleep(1);
}
}
void* thr_fun2(void *p)
{
sleep(1);
printf("Thread 2 entered....\n");
while(*(int *)p < 10)
{
pthread_mutex_lock(&mtx);
printf("thread2:data =%d\n ",*(int *)p);
(*(int *)p)++;
sleep(1);
printf("thread2:data(inc) =%d\n ",*(int *)p);
pthread_mutex_unlock(&mtx);
sleep(1);
}
}
main()
{
pthread_mutex_init(&mtx,0);
pthread_create(&t1,0,thr_fun1,0);
pthread_join(t1,0);
pthread_join(t2,0);
// printf("Back in main fun \n");
pthread_mutex_destroy(&mtx);
pthread_exit(0);
}
输出:
Thread 1 entered....
thread1:data =0
thread1:data(inc) =1
Thread 2 entered....
thread2:data =1
thread2:data(inc) =2
thread1:data =2
thread1:data(inc) =3
thread2:data =3
thread2:data(inc) =4
thread1:data =4
thread1:data(inc) =5
thread2:data =5
thread2:data(inc) =6
答案 0 :(得分:0)
这是未定义的行为。这是glibc吗?通常没有分段错误,因为glibc保留了线程堆栈的缓存,因此在线程退出后不会立即释放内存。
答案 1 :(得分:0)
当data == 6时,thread1退出,但不解锁互斥锁。 thread2仍然被阻塞,等待锁定互斥锁。 所以它不会出错。它只是陷入僵局。