Linux服务器开发——详解线程
文章插图
一、概念线程定义
- 一个线程指的是进程中一个单一顺序的控制流 , 也称为轻量进程(LWP)
- 一个进程可以有很多线程 , 每个线程并行执行不同的任务
- 线程会拥有自己的堆栈(不共享) , 但是它与同一进程中的多个线程将共享该进程中的全局变量、文件描述符等系统资源
- 根本区别:进程是最小的分配资源的单位 , 线程是最小的执行单位 。
- 通信机制:对于不同的进程之间 , 它们具有独立的数据空间 , 数据进行传递只能通过通信的方式进行 , 方式不仅耗时 , 而且不方便 。 但同一进程下的线程之间共享数据空间 , 通信很方便且安全
- 内存分配:系统在运行的时候会为每个进程分配不同的内存空间 , 而线程除了CPU外 , 不会再分配空间 , 而是使用进程的资源空间
- 从属关系:线程是进程的一部分 , 进程一旦结束 , 所有线程都结束
- 文件描述符表
- 每种信号的处理方式
- 当前工作目录
- 用户ID和组ID
- 内存地址空间
- 线程id
- 处理器现场和栈指针(内核栈)
- 独立的栈空间(用户空间栈)
- errno变量
- 信号屏蔽字
- 调度优先级
- 提高程序的并发性
- 开销小 , 不用重新分配内存
- 通信和共享数据方便
- 线程不稳定 , linux线程的概念比信号还晚才出来 , 库函数实现 , 需要链接 -lpthread
- 多线程调试比较困难(gdb支持不好)
- 线程无法使用unix经典事件 , 例如信号
- 像每个进程有一个进程ID一样 , 每个线程也有一个线程ID
- 进程ID在整个系统中是唯一的 , 但线程不同 , 线程ID只在它所属的进程环境中有效
- 线程ID用pthread_t数据类型来表示
文章插图
二、线程原语因为Linux多线程是有库函数实现的 , 需要添加头文件#include, 且编译的时候需要链接 -lpthread 库
线程创建
#include int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
参数- pthread_t *thread:传递一个pthread_t变量地址进来 , 用于保存新线程的tid(线程ID)
- const pthread_attr_t *attr:线程属性设置 , 如使用默认属性 , 则传NULL
- void *(*start_routine) (void *):函数指针 , 指向新线程应该加载执行的函数模块
- void *arg:指定线程将要加载调用的那个函数的参数
- 成功返回0 , 失败返回错误号 。 可以先用strerror()把错误码转换成错误信息再打印
#include pthread_t pthread_self(void);
返回值- 返回当前线程号
#include 【Linux服务器开发——详解线程】void pthread_exit(void *retval);
参数- rval_ptr是线程结束时的返回值 , 可由其他函数获取 , 如pthread_join() 。
- 如果进程中任何一个线程调用exit()或_exit() , 那么整个进程都会终止 。
- 线程的正常退出方式有:线程从线程函数中返回、线程可以被另一个线程终止以及线程自己调用pthread_exit()函数
#include int pthread_join(pthread_t thread, void **retval);
参数- pthread_t thread:回收线程的tid
- void **retval:接收退出线程传递出的返回值 , 不接收传NULL
- 成功返回0 , 失败返回错误号
#include int pthread_cancel(pthread_t thread);
参数- 线程ID号
#include int pthread_detach(pthread_t tid);
参数- pthread_t tid:分离线程tid
- 黑莓(BB.US)盘前涨逾32%,将与亚马逊开发智能汽车数据平台|美股异动 | US
- 开发自|不妥协不追随 Member’s Mark升级背后的“山姆哲学”
- 确认|三星确认正在开发“轻薄轻巧”的可折叠手机
- 推广|Josh Elman加盟苹果 负责开发者关系与软件推广工作
- 微信广告|小程序开发者看过来 流量变现倍增的秘籍来了!
- 移植|开发者将移植ARM Mac的Linux系统 但需要得到资金支持
- GNOME|[图]GNOME启动Circle项目:进一步扩大开发者规模
- 检查|填补软件开发市场空白,飞算全自动软件工程平台瞄准全自动后端微服务开发
- 格式化|利用好这3个隐藏技巧,Power BI 开发体验更丝滑
- 开发|三七数字产业平台率先在全国开发应用