线程间的数据共享与参数传递
来源:互联网 发布:霸气的淘宝昵称大全 编辑:程序博客网 时间: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
阅读全文
0 0
- 线程间的数据共享与参数传递
- 线程间的参数传递
- 线程间的数据共享
- 线程间传递参数
- 线程间共享数据
- 线程间数据共享
- 线程间数据共享
- C++中线程的使用与参数传递
- 线程间数据传递
- 线程间共享数据的一个例子
- c#线程间传递参数
- c#线程间传递参数
- c#线程间传递参数
- C#线程间传递参数
- c#线程间传递参数
- c#线程间传递参数
- java多线程3-线程的同步与数据传递
- 线程的数据共享和不共享
- 204. Count Primes
- 啥是IDC
- 【C语言】文件读取写入信息(二进制方式)
- 对前端控制器等配置的理解
- Camera.main.ScreenPointToRay(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0))
- 线程间的数据共享与参数传递
- 虚拟机中vmnet1和vmnet8
- c++ primer 第五版 练习13.5
- 初探C++11
- Java实现的全排列
- angular-cli初步学习
- 网络传输三要素,网络模型,http、TCP/IP协议与socket之间的区别
- A
- R数据录入和操作