线程
来源:互联网 发布:touch bar 知乎 编辑:程序博客网 时间:2024/05/23 00:03
线程
- 线程
线程是程序中的一条执行序列(执行单元),一个进程至少有一个线程(主线程),一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。 - 线程与进程的异同点
1)线程与进程都可以并发执行;
2)线程是进程调度的最小执行单位;进程时资源分配的最小单位;
3)在切换时,线程比进程消耗少,效率高; 线程的创建以及退出函数(phread.h)
(创建函数)int pthread_create(pthread_t id,pthread_attr_t *attr,void(pthread_fun)(void*),void*arg);
进程id一般由系统自动分配;attr为进程属性;pthread_fun为函数线程;arg为函数线程的参数(可以传值也可以传地址)1>传值时,强转为(void*),对arg再强转为其相应的变量类型;2>传地址时,对地址强转为(void*),对arg在强转为变量类型的指针,在取值;若传的是地址,获取变量值时要注意,变量值是否被改变;
(退出函数)void pthread_exit(void * reval);
(等待线程结束的函数)int pthread_join(pthread_t id,void**p);阻塞等待指定进程的退出以及获取指定进程由pthread_exit的退出信息;举例
创建两个线程:线程1打印100以内所有素数;线程2对数组进行选择排序,对主线程进行睡眠等待或者pthread_join等待线程1、2结束;
int ar[]={22,55,99,11,66,33,88,44,77};void *pthread_fun2(void *arg){ printf("函数线程2开始运行:对数组进行选择排序并打印::\n"); int i=0; int n=sizeof(ar)/sizeof(ar[0]); for(;i<n-1;++i) { int k=i; int j=i+1; for(;j<n;++j) { if(ar[k]>ar[j])k=j; } if(i!=j) { int tmp=ar[i];ar[i]=ar[k];ar[k]=tmp; } } for(i=0;i<n;++i)printf("%d ",ar[i]); printf("函数进程2结束\n");}void *pthread_fun1(void *arg){ printf("函数线程1开始运行:开始打印100以内所欲素数::\n"); int i=2; for(;i<100;++i) { int j=2; for(j=2;j<=i/2;++j) { if(i%j==0)break; } if(j>i/2)printf("%d ",i); } printf("函数进程1结束\n"); pthread_exit("fun1 over");}void main(){ printf("主函数开始::\n"); pthread_t id1; pthread_t id2; int res=pthread_create(&id1,NULL,pthread_fun1,NULL); assert(res==0); int res2=pthread_create(&id2,NULL,pthread_fun2,NULL); assert(res2==0);// sleep(10);//如果主函数可能先结束,则用pthread_exit(NULL); char *p=NULL; pthread_join(id1,(void**)&p);//等待进程1结束,并获取结束信息 pthread_join(id2,NULL);//等待线程2结束 printf("%s\n",p);//打印获取到的进程1的结束信息; printf("主函数结束\n");}
运行结果:
阅读全文
0 0
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- java内部类
- 解决Visual Studio编译错误"文本后缀无效; 未找到文文本运算符或文本运算符模板"
- 贪心法 求最大子阵列
- 51nod 1837 砝码称重
- Leetcode之Permutation in String 问题
- 线程
- SQL完整性约束
- UVA 469 Wetlands of Florida
- static和extern对函数的作用
- 机器学习第3章第5节 : 调整图像亮度
- 哈希查找
- Oracle 使用技巧
- HDU5977 Garden of Eden 树分治+高维前缀和
- Swift开发指南:使用Swift与Cocoa和Objective-C(Swift 4)