11 | 线程:如何让复杂的项目并行执行?

本文仅作为学习记录,非商业用途,侵删,如需转载需作者同意。

一、为什么要有线程

进程默认有一个主线程。
线程负责执行二进制指令,根据指令一行行执行下去。
进程管理的范围更大,除了指令,还包内存,文件系统等。

进程相当于一个项目;
线程是为了完成项目需求,而建立的一个个开发任务。

在这里插入图片描述

使用进程实现并行执行的问题有:
1、创建进程占用资源太多
2、进程之间的通信需要数据在不同的内存空间传来传去,无法共享

Linux中,前台任务和后台任务分开。
有些任务需要马上返回结果,例如输入一个字符
有些任务可以默默执行的,例如数据同步。
两个任务应该在不同的线程处理,相互不耽误。

二、如何创建线程

没看明白。。。。
在这里插入图片描述

三、线程的数据

在这里插入图片描述

线程访问的数据细分成三类:

3.1、线程栈上的本地数据

例如:函数执行过程中的局部变量

ulimit -a 查看栈大小,默认8192(8MB)
ulimit -s 修改
在这里插入图片描述
主线程在内存中有栈空间,其他线程也有独立的栈空间。
为了避免线程之间的栈空间踩踏,线程栈之间还会有小块区域,用来隔离保护各自的栈空间。
另一个线程踏入到这个隔离区,就会引发段错误。

3.2、整个进程里共享的全局数据

例如:全局变量。 同一个进程中共享,不同的进程是隔离的。

3.3、线程私有数据

四、数据的保护

4.1、Mutex

全称 Mutual Exclusion,中文叫互斥:
访问共享数据时,申请加把锁,谁先拿到锁谁就拿到了访问权限,其他人在门外等着,等这个人访问结束把锁打开,其他人再去争夺,还是遵循谁先拿到谁访问。

具体过程:

使用Mutex,首先使用 pthread_mutex_init 函数初始化这个mutex,初始化后可以用它来保护共享变量了。

pthread_mutex_lock() 就是去抢那把锁的函数,如果抢到了,就可以执行下一程序,对共享变量进行访问,如果没抢到,不会被阻塞,而是返回一个错误码。

当共享数据访问结束了,别忘了使用 pthread_mutex_unlock释放锁,让给其他人使用。最终调用 pthread_mutex_destroy 销毁掉这把锁。

在这里插入图片描述

条件变量

使用 pthread_mutex_lock(),需要一直在那里等着;
如果是pthread_mutex_trylock(),就不用等着干点别的。

没事就让大家歇着,有事了就去通知,别让人家没事就来问问,浪费大家时间:这就是条件变量

条件变量和互斥锁配合使用:

当接到了通知来操作共享资源的时候,还是需要抢互斥锁,因为可能很多人都收到了通知,都来访问了。
在这里插入图片描述

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值