C pthreads传递局部变量

时间:2017-07-18 18:37:31

标签: c multithreading pthreads

我编写了这段代码,以了解局部变量在线程中的工作原理。我从另一个线程创建它时将局部变量的地址传递给一个线程。原始线程退出后,当堆栈帧被销毁时,局部变量也会被破坏。那么新线程会发生什么?为什么没有分段错误?

#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

2 个答案:

答案 0 :(得分:0)

这是未定义的行为。这是glibc吗?通常没有分段错误,因为glibc保留了线程堆栈的缓存,因此在线程退出后不会立即释放内存。

答案 1 :(得分:0)

当data == 6时,thread1退出,但不解锁互斥锁。 thread2仍然被阻塞,等待锁定互斥锁。 所以它不会出错。它只是陷入僵局。