线程间的数据共享与参数传递

1、线程间的数据共享
(1)文件共享:因为文件存储在PCB里面,有文件表数组的存在。任何线程打开的文件,其他线程都可以通过文件描述符操作文件。

代码验证:

#include 
#include 
#include 
#include 
#include 
#include 
void* pthread_fun(void *arg)
{
    printf("fun pid= %d\n",getpid());
}

void main()
{
    pthread_t id;
    int res=pthread_create(&id,NULL,pthread_fun,NULL);
    assert(res==0);

    printf("main pid = %d\n",getpid());
    pthread_exit(NULL);
}

打印结果:
man pid = 3163
fun pid = 3163
所以文件是共享的。

(2)全局变量共享

代码验证:

#include 
#include 
#include 
#include 
#include 
#include 

int ga=10;
void* pthread_fun(void *arg)
{
    ga=20;
}

void main()
{
    pthread_t id;
    int res=pthread_create(&id,NULL,pthread_fun,NULL);
    assert(res==0);
    pthread_join(id,NULL);
    printf("ga=%d\n",ga);
}

打印结果:ga = 20
所以全局变量是共享的。

(3)堆区共享

代码验证:

#include 
#include 
#include 
#include 
#include 
#include 

char*s=NULL;
void* pthread_fun(void *arg)
{
    *s='b';
}

void main()
{
    s=(char*)malloc(1);
    *s='a';
    pthread_t id;
    int res=pthread_create(&id,NULL,pthread_fun,NULL);
    assert(res==0);
    pthread_join(id,NULL);
    printf("*s=%d\n",*s);
}

打印结果:*s=98
'b'是一个字符,对应的ascll是98,所以堆区共享。

(4)栈区不共享。

总结:多线程之间共享全局变量、堆区数据、文件描述符,但是各线程有自己的栈区。
而对于父子进程之间:全局、栈区、堆区都不会共享,但是文件是共享的。

2、线程的参数传递
eg:在主线程中定义局部变量int a=10,在函数线程中将其改为20。
可以,因为pthread_create中最后一个参数是void*,可以传地址。

代码验证:

#include 
#include 
#include 
#include 
#include 
#include 

void* pthread_fun(void *arg)
{
    int *p=(int*)arg;
    *p=20;
}

void main()
{
    int a=10;
    pthread_t id;
    int res=pthread_create(&id,NULL,pthread_fun,(void*)&a);
    assert(res==0);
    pthread_join(id,NULL);
    printf("a=%d\n",a);
}
打印结果:a=20

也可以用另外一种传递参数方法,如代码所示,刚好与上面的相反,即将pthread_create()中的传递参数直接为值,从而函数线程中将“*”去掉。

#include 
#include 
#include 
#include 
#include 
#include 

void* pthread_fun(void *arg)
{
    int p=(int)arg;
    p=20;
}

void main()
{
    int a=10;
    pthread_t id;
    int res=pthread_create(&id,NULL,pthread_fun,(void*)a);
    assert(res==0);
    pthread_join(id,NULL);
    printf("a=%d\n",a);
}
打印结果:a=20

你可能感兴趣的:(Linux)