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