博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自旋锁和互斥锁的区别
阅读量:4611 次
发布时间:2019-06-09

本文共 1433 字,大约阅读时间需要 4 分钟。

POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套API。线程同步是并行编程中非常重要的通讯手段,其中最典型的应用就是用

Pthreads提供的锁机制(lock)来对多个线程之间的共享临界区(Critical Section)进行保护(另一种常用的同步机制是barrier)。

Pthreads提供了多种锁机制:

  • Mutex(互斥量):pthread_mutex_t
  • Spin lock(自旋锁): pthread_spin_t
  • Condition Variable(条件变量): pthread_cond_t
  • Read/Write lock(读写锁):pthread_rwlock_t

Pthreads提供的Mutex锁操作相关的API主要有:

  • pthread_mutex_lock(pthread_mutex_t *mutex);
  • pthread_mutex_trylock(pthread_mutex_t *mutex);
  • pthread_mutex_unlock(pthread_mutex_t *mutex);

Pthreads提供的Spin Lock锁操作相关的API主要有:

  • pthread_spin_lock(pthread_spinlock_t *lock);
  • pthread_spin_trylock(pthread_spinlock_t *lock);
  • pthread_spin_unlock(pthread_spinlock_t *lock);

从实现原理上来讲,Mutex属于sleep-waiting类型的锁。例如在一个双核的机器上有两个线程(线程A和线程B),它们分别运行在Core0和Core1上。假设线程A想要通过pthread_mutex_lock操作去得到一个临界区的锁,而此时这个锁正被线程B所持有,那么线程A就会被阻塞,

Core0会在此时进行上下文切换(Context Switch)将线程A置于等待队列中,此时Core0就可以运行其它的任务而不必进行忙等待。而Spin lock

则不然,它属于busy-waiting类型的锁,如果线程A是使用pthread_spin_lock操作去请求锁,那么线程A就会一直在Core0上进行忙等待并不停的进行锁请求,直到得到这个锁为止。

自旋锁(Spin lock)

自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,“自旋锁”的作用

是为了解决某项资源的互斥使用。因为自旋锁不会引起调用者睡眠,所以自旋锁的效率远高于互斥锁。

自旋锁的不足之处:

自旋锁一直占用着CPU,他在未获得锁的情况下,一直运行(自旋),所以占用着CPU,如果不能在很短的时间内获得锁,这无疑会使CPU效率降低。

在用自旋锁时有可能造成死锁,当递归调用时有可能造成死锁,调用有些其他函数也可能造成死锁,如 copy_to_user()、copy_from_user()、kmalloc()等。

因此我们要慎重使用自旋锁,自旋锁只有在内核可抢占式或SMP的情况下才真正需要,在单CPU且不可抢占式的内核下,自旋锁的操作为空操作。自旋锁适用于锁使用者保持锁时间比较短的情况下。

 

转载于:https://www.cnblogs.com/guagua2016/p/6068925.html

你可能感兴趣的文章
配置JDKAndroid 2D游戏引擎AndEngine
查看>>
Highmaps网页图表教程之绘图区显示标签显示数据标签定位
查看>>
Arduino可穿戴开发入门教程Arduino开发环境介绍
查看>>
201621123055《JAVA程序设计》第十一周学习总结
查看>>
Eclipse 常用快捷键 常用技巧My Eclipse常用快捷键
查看>>
php.ini中safe_mode开启之后对于PHP系统函数的影响
查看>>
MFC的CListCtrl双击获取单元格的行列
查看>>
Leetcode 217. Contains Duplicate
查看>>
pat1035. Password (20)
查看>>
python 字符格式化
查看>>
NSMutableAttributedString(改变文字颜色)
查看>>
2016春招Android开发实习生(网易传媒)笔试
查看>>
免费搜索引擎提交网址大全
查看>>
avalon学习笔记ui篇-如何将avalon默认的amd模型禁止,以及用require重写。
查看>>
CSS中margin折叠问题记录
查看>>
关于数据中心叙述
查看>>
Go---第九章:使用共享变量实现并发(小知识点笔记)
查看>>
sql使用cte表达式进行递归查询
查看>>
Oracle 树操作(select…start with…connect by…prior)
查看>>
关于Unity中动画系统的学习文档
查看>>