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

来源:互联网 发布:霸气的淘宝昵称大全 编辑:程序博客网 时间:2024/06/01 22:24

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

代码验证:

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <assert.h>#include <pthread.h>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 = 3163fun pid = 3163所以文件是共享的。

(2)全局变量共享

代码验证:

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <assert.h>#include <pthread.h>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 <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <assert.h>#include <pthread.h>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 <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <assert.h>#include <pthread.h>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 <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <assert.h>#include <pthread.h>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
原创粉丝点击