线程
来源:互联网 发布:什么是淘宝旺旺号啊 编辑:程序博客网 时间:2024/06/07 21:27
一、概念:
线程:是进程内部的一个执行流,每个进程至少有一个线程,每个线程只能依赖一个进程,
线程通过线程库来创建,创建的线程被称为函数线程,main主函数呗称为主线程。
区分:
函数线程和函数调用的区别:
函数线程于主线程同时运行,分别在两条执行流中;而函数调用是顺序执行,与主函数在同一执行流中。
线程与进程的区别:
1、进程是资源分配的最小单位,线程是cpu调度的基本单位。
2、一个进程可以有多个线程,而一个线程只能依附于一个进程。
3、线程是轻量级的进程,不需要开辟大量内存。
4、进程是由双向的pcb链表进行管理的,而线程是由线程结构管理。
多线程之间共享资源:
全局变量、静态变量、堆区(在进程空间被开辟,所以为共享的)、文件等
独享资源:
线程id
线程的堆栈区(每一个函数线程都有自己的代码,有自己执行流,自己的堆栈区)
寄存器(由于线程之间是并发运行的,所以当一个线程切换到另一个线程中的时候要保存寄存器组的值,保护现场,便于之后继续运行,寄存器组里的数据也不尽相同)
线程的标识
线程id:pthread_t t;
获得当前线程的id
二、线程的使用
线程的创建:
int pthread_create(pthread_t *id, pthread_attr_t *attr, void*(*pthread_fun)(void*), void *arg); //创建一个函数线程 成功返回0,失败返回错误码
第一个参数是线程id ; 第二个参数是定义线程属性,现在暂时定为NULL ; 第三个参数代表创建线程的入口地址;第四个参数代表指针参数,说此函数线程需要的参数,若参数大于1,则可定义结构体进行传参
线程的终止:
如果进程中的任何线程调用了_exit,exit,Exit退出的话,整个进程都会终止。在结束单个线程不终止整个进程的条件下使用int pthread_exit(void *rval_ptr);函数结束线程
线程的等待:
int pthread_join(pthread_t id, void **rval_ptr); //等待指定线程结束,并获得由rval_ptr
保存的退出码
注:学习多线程时,因为pthread的库不是Linux系统的库,所以在进行编译的时候要加上:-lpthread。当主线程以exit结束时,进程结束,函数线程也会结束。
线程的传参方式,强转
传值:将值转为(void*)a,int b=(int)a;
传地址: (void*)&a,int b=*(int*)a先转为int型指针,再解引用
二、线程的管理
通过线程控制块,线程控制表来管理线程,共享资源是不需要存在控制块里的。
四、线程的实现
用户级线程:
线程表存于用户态,内核态只有一个进程表,如图所示只维护一个进程
内核级线程:
线程表存于内核,内核态有一个进程表,线程表,如图所示维护三个线程
混合模式:原因:在用户态的时候进程的切换简单,效率高,在阻塞运行时采用内核态
代码示例:创建一个线程,主线程里对数组元素进行排序,函数线程里输出字符串的长度
#include<stdio.h>#include<assert.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<pthread.h>#include<semaphore.h>void * fun(){ printf("fun begin\n"); char *arr="hello world!"; int size=strlen(arr); printf("%s length:%d\n",arr,size); printf("fun end\n");} void main(){ printf("main begin\n"); pthread_t id; pthread_create(&id,NULL,fun,NULL);//创建线程 int arr[]={1,6,34,2,9,5}; int length=sizeof(arr)/sizeof(arr[0]); int i,j; for(i=0;i<length-1;i++) { for(j=0;j<length-i-1;j++) { if(arr[j]>arr[j+1]) { int tmp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=tmp; } } } int k; for(k=0;k<length;k++) { printf("%d ",arr[k]); } printf("\n"); sleep(2); printf("main end\n");}
结果显示:
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- Kolla 部署OpenStack失败问题(2)
- 多线程处理耗时的业务逻辑
- 简单的文本复制器
- TensorFlow 介绍及安装
- 竞赛总结
- 线程
- Raspberry pi 3B自定义开机动画
- java基础面试题
- java程序员从笨鸟到菜鸟之(十二)String练习
- Android DataBinding原理解析
- redis主从复制
- 海思--Hi3516aIVE--基础
- Could not autowire. No beans of 'xxxx' type found的错误提示(IntelliJ Idea)
- 数据结构与算法之七(划分算法与快速排序)