目录:
1.为什么需要同步和互斥
2.明确一些概念
3.实现一个抢票程序
4.理解加锁和解锁是原子的呢??
-------------------------------------------------------------------------------------------------------------------------
1.为什么需要同步和互斥
2.明确一些概念
------------------------------------------------------------------------------------------------------------------------
3.实现一个抢票系统
我们先简单的创建线程操作
我们要实现一个抢票逻辑
我们再来看看实现的效果
现在tickets就是临界资源,这个临界资源不是安全的,为什么不是安全的呢??
tickets--并非原子的
对临界区进行加锁
pthread_mutex_init
如果这把锁你不想用了你可以释放掉
pthread_mutex_destroy
pthread_mutex_lock 加锁
此时我们就写出来了安全的抢票机制
4.理解加锁和解锁是原子的呢??
申请锁和释放锁本身就是原子的!!!
一行代码是代码是原子的:只要你一行代码经过编译,只有一行汇编的代码是原子的!!!
那么互斥锁是怎么做到的呢??
实现互斥锁,大多数体系结构都提供了swap和exchange指令,该指令的作用是把寄存器和内存单元的数据相交换,由于一条指令,保证原子性,即使是多处理器平台,访问内存的,总线周期也有先后,一个处理器上的交换指令执行时另一个处理器的交换指令只能等待总线周期
提供了swap和exchange指令的目的是:用一条汇编,完成内存和CPU内寄存器数据的交换!!
这就是为什么申请锁是原子的原理了
mutex的本质其实是通过一条汇编,将锁数据交换到自己的上下文中!!!!
那么我们现在有一个问题了!!
我们A在竞争锁成功之后,在加锁和解锁的过程中,有没有可能被切走呢??