Linux基础-线程
概念
由于进程在切换时系统开销大,因此很多操作系统引入了轻量级进程LWP,同一进程中的线程共享相同地址空间,Linux不区分进程、线程。
线程特点
进程有独立的地址空间,Linux为每个进程创建task_struct,每个进程都参与内核调度,互不影响。而线程指的是共享相同地址空间的多个任务,注意Linux不区分进程、线程。
一个进程中的多个线程共享以下资源:
① 可执行的指令
② 静态数据
③ 进程中打开的文件描述符
④ 当前工作目录
⑤ 用户ID
⑥ 用户组ID
每个线程私有的资源包括:
① 线程ID (TID)
② PC(程序计数器)和相关寄存器
③ 堆栈
④ 错误号 (errno)
⑤ 优先级
⑥ 执行状态和属性
Linux线程库
3.1 pthread线程库中提供了如下基本操作
创建线程
回收线程
结束线程
3.2 同步和互斥机制
信号量
互斥锁
4. 线程函数
4.1 线程创建 – pthread_create
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*routine)(void *), void *arg);
成功返回0,失败时返回错误码, thread 线程对象, attr 线程属性,NULL代表默认属性
routine 线程执行的函数, arg 传递给routine的参数 ,参数是void * ,注意传递参数格式。
4.2 线程结束 – pthread_exit
#include <pthread.h>
void pthread_exit(void *retval);
结束当前线程, retval可被其他线程通过pthread_join获取, 线程私有资源被释放。
4.3 线程查看tid函数
#include <pthread.h>
pthread_t pthread_self(void); // 查看自己的TID
4.4 线程查看命令
ps -eLf
4.5 线程回收 – pthread_join
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
对于一个默认属性的线程 A 来说,线程占用的资源并不会因为执行结束而得到释放,需要进行线程回收。 成功返回0,失败时返回错误码。 thread 要回收的线程对象, 调用线程阻塞直到thread结束。
*retval 接收线程thread的返回值。
例1
Testhread 打印信息后5s退出线程,并且pthread_join()回收线程资源。注意此例中第19行和第6行直接的子进程的参数传递。通过传递&i的地址,子线程中强制类型转换i的地址指针后再取地址中的值。
#include <stdio.h>
#include <pthread.h>
#include <time.h>
#include <unistd.h>void *Testhread(void *arg) {printf("This is Testhread arg = %d ...\n", *(int*)arg);sleep(5);pthread_exit(NULL);
}int main(int argc, char **argv)
{pthread_t tid;int i = 3;int ret;void *retv;tid = pthread_create(&tid, NULL, Testhread,&i);ret = pthread_join(tid,&retv);while (1) {sleep(1);}return 0;
4.6 线程分离pthead_detach
int pthread_detach(pthread_t thread); 成功:0;失败:错误号
指定该状态,线程主动与主控线程断开关系。线程结束后(不会产生僵尸线程)
pthread_attr_t attr; /*通过线程属性来设置游离态(分离态)*/
设置线程属性为分离
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
例 2
创建100个线程,线程创建后10s执行pthread_detch与主进程脱离关系并且退出线程。
include <stdio.h>
#include <pthread.h>
#include <unistd.h>void *Testhread(void *argv)
{printf("This is %d thread...\n", *(int *)argv);sleep(10); pthread_detach(pthread_self()); printf("%d is exit ..\n",(int)pthread_self());pthread_exit(NULL);}int main(int argc, char **argv)
{pthread_t tid[100];int ret;int i;for (i = 0; i<100; i++){ret = pthread_create(&tid[i], NULL, Testhread,&i); //pthread_detach(tid[i]); sleep(1);}while (1) {sleep(1); }return 0;
}
4.7 取消一个线程
int pthread_cancel(pthread_t thread); 杀死一个线程
void pthread_testcancel(void);
int pthread_setcancelstate(int state, int *oldstate);
PTHREAD_CANCEL_ENABLE
PTHREAD_CANCEL_DISABLE
int pthread_setcanceltype(int type, int *oldtype);
PTHREAD_CANCEL_DEFERRED
PTHREAD_CANCEL_ASYNCHRONOUS
4.8 线程的清理
void pthread_cleanup_push(void (*routine) (void *), void *arg)
void pthread_cleanup_pop(int execute)
Linux基础-线程相关推荐
- 快速入门:LINUX基础 ——教你使用 linux 操作
文章目录 一.LINUX介绍 二.环境搭建 三.如何在LINUX下做开发 1.LINUX 中-vi的使用 四.LINUX常用初级指令介绍和使用 五.Linux虚拟机和windows间的文件传输方式 L ...
- 20155301 滕树晨linux基础——linux进程间通信(IPC)机制总结
20155301 滕树晨linux基础--linux进程间通信(IPC)机制总结 共享内存 共享内存是在多个进程之间共享内存区域的一种进程间的通信方式,由IPC为进程创建的一个特殊地址范围,它将出现在 ...
- linux用户空间和内核exit的语义--linux没有线程
如果你在程序中调用了exit,那么很显然你的程序会退出,可是至于为何会退出那就是库的事情了,我为什么说只是库的事情而不关linux内核的事情呢?那是因为linux内核根本不管用户空间的行为策略.库的策 ...
- Linux获取线程id的方法学习
From: http://www.linuxidc.com/Linux/2014-01/94723.htm 最近一直在想: 如何确认两段代码是不是在同一个线程中执行的呢? 通过查看资料,发现一种比较简 ...
- Linux基础命令-进程与系统性能
Linux基础命令-进程与系统性能 进程与系统性能 一.进程相关概念 1.进程概念 2.进程的基本状态和转换 3.IPC进程间通信 4.进程优先级 5.进程状态 二.进程与系统性能 1.系统管理工具 ...
- 2017-2018-2 20179204《网络攻防实践》linux基础
我在实验楼中学习了Linux基础入门课程,这里做一个学习小结. 第一节 linux系统简介 本节主要介绍了linux是什么.发展历史.重要人物.linux与window的区别以及如何学习linux. ...
- Linux基础(一)基本命令
Linux基础(一)基本命令 Linux的文件系统 Linux的终端命令 ls指令 cd指令 mkdir 指令 rm 指令 pwd 指令 touch 指令 mv 指令 cp 指令 tar 指令 fin ...
- 大数据学习之路-Linux基础
Linux基础与Shell编程 1. Linux概述 2. 系统安装 3. Linux目录与结构 4. VI/VIM编辑器 4.1 打开和新建文件 4.2 VI三种工作模式 末行模式命令 一般模式 编 ...
- Linux随笔-鸟哥Linux基础篇学习总结(全)
Linux随笔-鸟哥Linux基础篇学习总结(全) 修改Linux系统语系:LANG-en_US,如果我们想让系统默认的语系变成英文的话我们可以修改系统配置文件:/etc/sysconfig/i18n ...
最新文章
- 两次杀人,自动驾驶技术之恶
- 如何在敏捷框架下做好工作交接
- linux平台下 延迟工作队列实例
- go中 -strconv包的使用
- Webbench的使用
- Dubbo管控台Windows安装
- 每日程序C语言42-带头结点的尾插法创建链表
- Collections.binarySearch用法
- AngularDart Material Design 步进器
- 【SPOJ - QTREE2】Query on a tree II(LCA,倍增)
- IoU,ROI 和 ROC,AUC区分
- Linux编程(2)_软件的安装和卸载
- 7-8 查验身份证 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:
- 首都师范 博弈论 5 5 1大联盟合作博弈中如何量化决策影响力 班扎夫权力指数
- ORACLE临时表空间总结
- 风变编程python课_聊一聊风变编程Python线上课程
- android wear 制作时钟界面,android wear开发之绘制表盘.doc
- 2022春季数据结构期中考试总结
- 视频解析网站 服务器上,视频云解析服务器上
- .exe文件打开闪退
热门文章
- 用FPGA实现尼康绝对值编码器的数据读取
- 中关村互联网教育创新中心:这里是互联网教育的主场
- MPS | 简单易用的工业电源模块
- 全城最浪漫的颜值影城在这
- discuz应用中心,discuz应用中心问题解决
- laraverl框架房源管理
- 数据分析课后作业--信用卡客户风险评价(代码)
- (已解决)jar!/BOOT-INF/classes!/application.yml (No such file or directory)
- 总结702考研复习DAY26
- Q2复苏慢,华米科技的“两条腿”还行吗?