任务1:定义一个全局变量 int a=10,主线程能否访问到,分支线程能否访问到;
任务2:分支线程中修改上述的a = 20, 问主线程中访问该a,是10还是20;
任务3:在主线程定义一个局部变量int b=1,分支线程能否访问到b;
任务4:在分支线程定义一个局部变量int c=2,主线程能否访问到c;
任务5:如果任务34不能访问到,则如何修改代码让对方能够访问到;
任务1:定义一个全局变量 int a=10,主线程能否访问到,分支线程能否访问到;
可以访问到
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
int a=10;
void* turn_back(void *num){
while(1){
printf("分支线程--> a=%d\n",a);
sleep(1);
}
}
int main(int argc, const char *argv[])
{
pthread_t pth=0;
if((pthread_create(&pth,NULL,turn_back,NULL))!=0){
fprintf(stderr,"pthread_create failed\n");
return -1;
}
while(1){
printf("主线程--> a=%d\n",a);
sleep(1);
}
return 0;
}
运行结果:
任务2:分支线程中修改上述的a = 20, 问主线程中访问该a,是10还是20;主线程第一次访问的是10,之后访问的就全是20
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
int a=10;
void* turn_back(void *num){
a=20;
while(1){
printf("分支线程--> a=%d\n",a);
sleep(1);
}
}
int main(int argc, const char *argv[])
{
pthread_t pth;
if((pthread_create(&pth,NULL,turn_back,NULL))!=0){
fprintf(stderr,"pthread_create failed\n");
return -1;
}
while(1){
printf("主线程--> a=%d\n",a);
sleep(1);
}
return 0;
}
运行结果:
任务3:在主线程定义一个局部变量int b=1,分支线程能否访问到b;分支线程不能访问到b,因为分支线程没有指针指向b的空间
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void* turn_back(void *num){
while(1){
printf("分支线程--> b=%d\n",b);
sleep(1);
}
}
int main(int argc, const char *argv[])
{
int b=1;
pthread_t pth;
if((pthread_create(&pth,NULL,turn_back,NULL))!=0){
fprintf(stderr,"pthread_create failed\n");
return -1;
}
while(1){
printf("主线程--> b=%d\n",b);
sleep(1);
}
return 0;
}
运行结果:
任务5:如果任务3不能访问到,则如何修改代码让对方能够访问到;
将b当作实参,传址到分支线程
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void* turn_back(void *num){
while(1){
printf("分支线程--> b=%d\n",*(int *)num);
sleep(1);
}
}
int main(int argc, const char *argv[])
{
int b=1;
pthread_t pth;
if((pthread_create(&pth,NULL,turn_back,&b))!=0){
fprintf(stderr,"pthread_create failed\n");
return -1;
}
while(1){
printf("主线程--> b=%d\n",b);
sleep(1);
}
return 0;
}
运行结果:
任务4:在分支线程定义一个局部变量int c=2,主线程能否访问到c;主线程不能访问到c,因为局部变量c的生命周期只在定义函数的花括号内
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void* turn_back(void *num){
int c=2;
while(1){
printf("分支线程--> c=%d\n",c);
sleep(1);
}
}
int main(int argc, const char *argv[])
{
pthread_t pth;
if((pthread_create(&pth,NULL,turn_back,NULL))!=0){
fprintf(stderr,"pthread_create failed\n");
return -1;
}
while(1){
printf("主线程--> c=%d\n",c);
sleep(1);
}
return 0;
}
运行结果:
任务5:如果任务4不能访问到,则如何修改代码让对方能够访问到;利用static延长局部变量c的生命周期,然后设置函数返回值,在主函数内定义一个变量来接函数的返回值
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void* turn_back(void *num){
static int c=2;
/*
while(1){
printf("分支线程--> c=%d\n",c);
sleep(1);
}
*/
return &c;
}
int main(int argc, const char *argv[])
{
pthread_t pth;
if((pthread_create(&pth,NULL,turn_back,NULL))!=0){
fprintf(stderr,"pthread_create failed\n");
return -1;
}
int *c1=(int *)turn_back(NULL);
while(1){
printf("主线程--> c=%d\n",*c1);
sleep(1);
}
return 0;
}
运行结果: