任务1:定义一个全局变量 int a=10,主线程能否访问到,分支线程能否访问到;
答:主线程与分支线程都可以访问到全局变量a;
代码:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void *headler(void *arg);
int a = 10;
int main(int argc, const char *argv[])
{
pthread_t thread;
pthread_create(&thread,NULL,headler,NULL);
while(1)
{
printf("主线程a = %d\n",a);
sleep(1);
}
return 0;
}
void *headler(void *arg)
{
while(1)
{
printf("分支线程 a = %d\n",a);
sleep(1);
}
}
现象:
任务2:分支线程中修改上述的a = 20, 问主线程中访问该a,是10还是20;
答:是20,主线程与分支线程访问的是同一片空间,修改后空间的值也会改变。
代码:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void *headler(void *arg);
int a = 10;
int main(int argc, const char *argv[])
{
pthread_t thread;
pthread_create(&thread,NULL,headler,NULL);
while(1)
{
printf("主线程a = %d\n",a);
sleep(1);
}
return 0;
}
void *headler(void *arg)
{
a = 20;
while(1)
{
printf("分支线程 a = %d\n",a);
sleep(1);
}
}
现象:
任务3:在主线程定义一个局部变量int b=1,分支线程能否访问到b;
答:不能,在主线程定义的局部变量,分支线程无法获取其实际地址。
现象:
任务4:在分支线程定义一个局部变量int c=2,主线程能否访问到c;
答:不能,在分支线程中定义的局部变量,主线程同样无法获取其地址;
现象:
任务5:如果任务34不能访问到,则如何修改代码让对方能够访问到;
在任务3:可以利用pthread_greate函数的最后一个参数,将b的地址作为为传给分支线程函数的参数让分支线程得到b的地址获取b的值,但因为分支线程的函数参数是万能指针,所以需要强制转换后才能解引用。
代码:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void *headler(void *arg);
int a = 10;
int main(int argc, const char *argv[])
{
int b = 1;
pthread_t thread;
pthread_create(&thread,NULL,headler,&b);
while(1)
{
printf("主线程a = %d\n",a);
sleep(1);
}
return 0;
}
void *headler(void *arg)
{
a = 20;
while(1)
{
printf("分支线程 a = %d b = %d\n",a,*(int *)arg);
sleep(1);
}
}
现象:
在任务四:在主调函数与被调函数的返回值关系中可以将定义在被调函数的定义的变量地址返回给主调函数,这里也可以将分支线程作为被调函数,将c的地址作为返回值返回给主线程函数,但是因为想得到返回值需要将函数结束,因此分支线程函数不能有死循环,同时为了保证c的地址不会因分支线程函数的结束而被释放,需要利用static延长c的生命周期。
代码:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void *headler(void *arg);
int a = 10;
int main(int argc, const char *argv[])
{
int b = 1;
pthread_t thread;
pthread_create(&thread,NULL,headler,&b);
sleep(1);
printf("主线程 a = %d\n",a);
int *c = (int *)headler(&b);
while(1)
{
printf("主线程a = %d c = %d\n",a,*c);
sleep(1);
}
return 0;
}
void *headler(void *arg)
{
a = 20;
static int c = 2;
printf("分支线程 a = %d b = %d\n",a,*(int*)arg);
return &c;
}
现象: