学习目标:
- 互斥锁 — mutex
- 自旋锁 — spinlock
- 原子操作
学习内容:
一、互斥锁 — mutex
-
概念
对共享数据进行锁定,保证同一时刻只能有一个线程去操作。 -
图解
-
应用函数
–pthread_mutex_init()
–pthread_mutex_lock()
–pthread_mutex_unlock() -
基本用法
pthread_mutex_t mutex;//结构体初始化
pthread_mutex_init(&mutex, NULL);//锁的初始化
pthread_mutex_lock(&mutex);//加锁
//....程序操作
pthread_mutex_unlock(&mutex);//解锁
二、自旋锁 — spinlock
-
概念
当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。 -
应用函数
–pthread_spin_init()
–pthread_spin_lock()
–pthread_spin_unlock() -
基本用法
pthread_spinlock_t spinlock;//结构体初始化
pthread_spin_init(&spinlock, PTHREAD_PROCESS_SHARED)//锁的初始化
pthread_spin_lock(&spinlock);//加锁
//....程序操作
pthread_spin_unlock(&spinlock);//解锁
三、互斥锁和自旋锁的区别
- 自旋锁与互斥锁作用类似,它们都是为了解决对某项资源的互斥使用。
- 什么时候用自旋锁,什么时候用互斥锁?
自旋锁–> while(1)–>应用于锁的内容很少时
互斥锁–> 引起线程切换–>应用于锁的内容较多时
四、原子操作
- 概念
不可中断的一个或者一系列操作, 也就是不会被线程调度机制打断的操作, 运行期间不会有任何的上下文切换 - 作用
1.如果确定某个操作是原子的, 就不用为了去保护这个操作而加上会耗费昂贵性能开销的锁
2.借助原子操作可以实现互斥锁
3.借助互斥锁, 可以实现让更多的操作变成原子操作.