linux(线程同步和互斥)

目录:

        1.为什么需要同步和互斥

       2.明确一些概念

       3.实现一个抢票程序

       4.理解加锁和解锁是原子的呢??

-------------------------------------------------------------------------------------------------------------------------

1.为什么需要同步和互斥

linux(线程同步和互斥)_第1张图片

 2.明确一些概念

linux(线程同步和互斥)_第2张图片

 ------------------------------------------------------------------------------------------------------------------------

3.实现一个抢票系统

我们先简单的创建线程操作

linux(线程同步和互斥)_第3张图片

 我们要实现一个抢票逻辑

linux(线程同步和互斥)_第4张图片

我们再来看看实现的效果

linux(线程同步和互斥)_第5张图片

 现在tickets就是临界资源,这个临界资源不是安全的,为什么不是安全的呢??

linux(线程同步和互斥)_第6张图片

linux(线程同步和互斥)_第7张图片

 tickets--并非原子的

对临界区进行加锁

pthread_mutex_init

linux(线程同步和互斥)_第8张图片

 如果这把锁你不想用了你可以释放掉

pthread_mutex_destroy

linux(线程同步和互斥)_第9张图片

 pthread_mutex_lock   加锁

linux(线程同步和互斥)_第10张图片

 linux(线程同步和互斥)_第11张图片

 linux(线程同步和互斥)_第12张图片

此时我们就写出来了安全的抢票机制

 4.理解加锁和解锁是原子的呢??

linux(线程同步和互斥)_第13张图片

申请锁和释放锁本身就是原子的!!!

一行代码是代码是原子的:只要你一行代码经过编译,只有一行汇编的代码是原子的!!!

linux(线程同步和互斥)_第14张图片

 那么互斥锁是怎么做到的呢??

实现互斥锁,大多数体系结构都提供了swap和exchange指令,该指令的作用是把寄存器和内存单元的数据相交换,由于一条指令,保证原子性,即使是多处理器平台,访问内存的,总线周期也有先后,一个处理器上的交换指令执行时另一个处理器的交换指令只能等待总线周期

提供了swap和exchange指令的目的是:用一条汇编,完成内存和CPU内寄存器数据的交换!!

linux(线程同步和互斥)_第15张图片

 这就是为什么申请锁是原子的原理了

mutex的本质其实是通过一条汇编,将锁数据交换到自己的上下文中!!!!

linux(线程同步和互斥)_第16张图片

 那么我们现在有一个问题了!!

我们A在竞争锁成功之后,在加锁和解锁的过程中,有没有可能被切走呢??

linux(线程同步和互斥)_第17张图片

 linux(线程同步和互斥)_第18张图片

 

你可能感兴趣的:(Linux模块学习,linux)