线程 进程

学习目标:

提示:这里可以添加学习目标
例如:一周掌握 Java 入门知识


学习内容:

一.线程*:
什么是线程:
他们不属于同一个虚拟内存,每个进程占用一块独立的虚拟内心块
线程是进程的一个实体,它是进程运行的最小单位

二,为什么要学习线程

  1. 线程是进程的一个实体,它是进程运行的最小单位,它比进程要消耗更少的资源
    2.能共享地址空间(进程)(堆栈:程序栈)

三,线程的组成
1.指令指针(指向当前执行的命令)
2.一个栈(函数栈)
3.寄存器的集合(状态寄存器:一部分正在运行中的处理器的状态)
4.一个私有的数据区

线程的特点:
线程切换的开销很低
线程的通信机制简单

线程并不是操作系统中内核所提供的而是由线程库来提供libpthread.a/so
调度线程的api离不开os的支持
创建线程
pthread_create(定义的大小, 指针,函数 参数
pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
pthread_t *thread:指向线程的指针
const pthread_attr_t *attr:创建线程时的属性:NULL无属性创建
void *(*start routine) (void *):线程运行的实体函数指针
void *arg:线程的参数:

注意:线程是进程的一个实体,一旦主进程运行结束,就会被回收

创建两个次进程,两个次进程分别得向同一个文件中写“helloworld\n"
线程等待
Pthread_join
int pthread_join(pthread_t thread, void **retval);
需要等待的线程 返回状态

线程退出:
被动退出:int pthread_cancel(phread_thread)
1)功能
当次进程是死循环时,可以调动这个函数主动取消该线程。
2)返回值
成功返回0,失败返回非另错误号
2)参数
thread:要取消线程的TID
2.返回值
成功返回0,失败返回非零值

3.参数
retval:线程结束的返回值
如果返回值很多时,就会被封装成结构体的地址即可

return()

注册线程退出处理函数

弹栈线程退出处理函数的几种条件
pthread cleanup_push(!0)主动弹栈
如果线程是被别人调用取消的 也会弹栈
如果调用pthread_exit函数也是会主动弹栈

注意:return退出的画是不会自动弹栈的,想要自动弹栈用pthread_cleanpop(!0)

线程等待的目的
一.保证线程的退出顺序:保证一个线程退出并且回收资源后允许下一个进程退出
回收线程退出时的资源情况:保证当前退出后,创建的新线程不会复用刚才退出线程的地址空间
获取新线程退出时的结果是否是正确退出返回值,

线程的状态
可结合态:这种状态下的线程是能被其他进程回收资源或被杀死的
可分离态:不能被其他进程回收资源或被杀死的,它存储的资源在它终止时由系统自动回收
默认情况下:线程是可结合态
线程分离函数
pthread detach()
int pthread_detach(pthread_t thread);
1.功能:如果此线程不希望别人调用pthread_join函数来回收,而是希望自己在运行结束时,自动回收资源用pthread_detach
将pthread_detach()中的线程变为分离态
2.返回值:成功返回0,失败返回一个错误数字
3.参数:tid-你要分离的参数
调度优先级 地址空间 所有的id存放在 tach_struct
线程通信机制
共用进程共享空间 函数切换 开销小

线程和进程的区别
1.进程是资源分配的最小单位,线程是资源调度的最小单位
2.每个进程有独立的地址空间 ,线程共享进程的地址空间 线程之间的切换比进程之间的切换开销小
3.线程的调度通过频繁加锁解锁来保存线程的同步,影响线程的开发性
4.进程比线程更健康,多进程间相互独立,一个进程的异常对其他进程五影响,而一个线程的崩溃可能影响其他线程或者整个程序
5.线程间的通信(小数据量),同进程下共享全局变量,静态变量等数据,而进程间的通信需要以通信的方式进行(IPC), 如何处理号同步与互斥是编写多线程程序的难点
6.多线程的代码结构比多进程的代码结构简单易读

线程同步,互斥锁,线程信号量,条件变量
互斥锁:
1.定义一个互斥锁(变量)pthread_mutex_t mutex;
2.初始化锁:预设互斥锁的初始值 pthread_mutex_mutex=PTHREAD_MUTEX
功能:
初始化定义的互斥锁(就是设置互斥锁所需要的值)
返回值
总是返回0,所以这个函数不需要进行错误处理
参数
mutex:互斥锁
3.加锁解锁 pthread_mutex_lock(&mutex);(阻塞加锁)访问
4.进程退出时销毁互斥锁

线程信号量:
1.定义信号量集合
sem t sem3
线程信号量集合其实就是一个数组,数组每个元素就是一个信号量(sem【0】:第一个信号量
sem【1】:第一个信号量
sem【2】:第一个信号量
2.初始化集合中的每个信号量
线程信号量使用步骤:
1.定义信号量集合
Sem_t sem3
线程信号量集合其实就是一个数组,数组每个元素就是一个信号量
(sem[0]:第一个信号量
sem1:第二个信号量
。。。。。。。。。。。。)
2.初始化集合中的每个信号量
#include<semaphore.h>
Int sem_init(sem_t*sem,int pthread,unsigned int value)
功能:
初始化线程信号量集合中的某个信号量,给他设置一个初值
返回值:
成功返回0,失败返回-1,errno被设置
信号量的错误号不是返回的,而是直接设置到errno
3.p,v
操作
4.进程结束时,删除线程信号量集合

学习时间:

提示:这里可以添加计划学习的时间
例如:
1、 周一至周五晚上 7 点—晚上9点
2、 周六上午 9 点-上午 11 点
3、 周日下午 3 点-下午 6 点


学习产出:

提示:这里统计学习计划的总量
例如:
1、 技术笔记 2 遍
2、CSDN 技术博客 3 篇
3、 学习的 vlog 视频 1 个3、 学习的 vlog 视频 1 个@TOC

欢迎使用Markdown编辑器

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱技术的小曹

你的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值