linux多线程

线程的竞争
竞争产生的原因:多个线程对同一个变量进行+1操作,如果线程A对变量先读后写的过程中,线程切换到B,B对变量进行+1后,切换回A,但是A是按照之前读的变量值进行+1再赋值给变量,所以相当于B没进行+1。
(进程也会产生竞争,比如进程之间通信时,通过共享内存会导致竞争)
常见的锁
在这里插入图片描述
(1)互斥锁
在这里插入图片描述

(2)读写锁
在这里插入图片描述
当有读锁时,写锁无法获得,防止别的线程在读,你突然写了,久会导致数据出现问题
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果使用的宏定义初始化锁,不需要使用unlock销毁读写锁
在这里插入图片描述
读写锁是互斥的,这就会导致存在一个问题,写饥饿
就是当写锁想要获取时,读锁一直在不停的获取,这就会导致写锁卡住。
解决方法就是:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(3)自旋锁
在这里插入图片描述

(4)条件变量
就是线程在获取锁和解锁这个过程中,他想要释放锁,比如写线程的buffer满了,想短暂的释放锁,让读线程来清理buffer,引入了条件变量机制。其实就是在中间加个条件变量,然后堵塞该线程,直到别的线程通过该条件变量来唤醒。主要还是线程锁是采用争抢机制的,你无法按照你想的流程来进行,引入条件变量就好很多。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(5)信号量
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
信号量可以用来解决进程间同步问题,通过共享内存,将sem_t这个信号量映射,所有的进程都可以看到
在这里插入图片描述
在这里插入图片描述
有名信号量
在这里插入图片描述
线程池:
在这里插入图片描述
在这里插入图片描述
具体api线程池b站尚硅谷
线程池好像就是专门创建指定数量得线程,都执行同一个任务,但是可以给线程池传递参数,让其实现不同的功能。
在这里插入图片描述

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值