实验三:线程共享进程数据
一、 实验目的:
- 了解线程和进程之间的数据共享关系,创建一个线程,在线程中更改进程中的数据;
二、 实验内容:
- 在进程中定义全局共享数据,在线程中直接引用该数据进行更改并输出该数据;
三、实验要求
- 显示和输出共享数据;
四、实验设计与实现:
-
设计思路:定义一个全局共享变量并在进程中输出全局变量,然后在进程中通过 pthread_create函数 创建线程,在线程函数中读取全局变量的值并修改全局变量的值,然后在进程中输出全局变量的值,若输出的值是修改后的值,说明共享数据被线程修改成功。
-
实验环境:Linux系统,Ubuntu 64位 20.04.2.0;
-
实验代码:
-
change_test.c
/* * 该程序实现了在线程中修改共享全局变量test; * 在Linux系统中编译时,格式:gcc change_test.c -lpthread(这是因为Linux中没有内置pthread库) */ #include<stdio.h> #include<pthread.h> #include<unistd.h> #include<stdlib.h> /* 全局变量test */ static int test = 1; /* *该函数用来输出错误信息; */ void print_err(char *estr) { perror(estr); exit(-1); } /* 该函数为线程函数; */ void *pth_fun(void *pth_arg) { sleep(1); printf("\033[35;1m线程函数:\n"); printf(" 该线程tid= %ld\n",(unsigned long int)pthread_self()); printf(" 共享的全局变量为:%d\n", test); test = 2; printf(" 修改共享全局变量为:%d\033[0m\n", test); return (void *)0; } int main() { /* 线程的tid,数据类型pthread_t是无符号长整数(unsigned long int) */ pthread_t tid; printf("\033[33;1m进程:共享的全局变量值为:%d\033[0m\n", test); /* 通过pthread_create函数创建线程; */ if(pthread_create(&tid, NULL, pth_fun, NULL)) { print_err("create fail\n"); return -1; } else { sleep(2); printf("\033[33;1m进程:\n"); printf(" 线程函数调用完毕;\n"); printf(" 创建线程返回的tid为:%ld\n", (unsigned long int)tid); printf(" 共享的全局变量为:%d\033[0m\n", test); return 0; } }
-
五、实验结果分析:
-
在Linux终端中输入:
gcc change_test.c -lpthread ./a.out
-
终端输出结果:
-
紫色为线程输出,黄色为进程输出,可以清晰地看出共享全局变量值的变化过程(初始值为1,线程函数中改为2,修改后在进程中变量值为2)
参考文章:
https://blog.youkuaiyun.com/qq_41122796/article/details/80294206