zoukankan      html  css  js  c++  java
  • 24.1、你知道哪几种线程锁(POSIX)?

    互斥锁(mutex)

    互斥锁属于sleep-waiting类型的锁。例如在一个双核的机器上有两个线程A和B,它们分别运行在core 0和core 1上。假设线程A想要通过pthread_mutex_lock操作去得到一个临界区的锁,而此时这个锁正被 线程B所持有,那么线程A就会被阻塞,此时会通过上下文切换将线程A置于等待队列中,此时core 0 就可以运行其他的任务(如线程C)。

    条件变量(cond)

    自旋锁(spin)

    自旋锁属于busy-waiting类型的锁,如果线程A是使用pthread_spin_lock操作去请求锁,如果自旋锁已 经被线程B所持有,那么线程A就会一直在core 0上进行忙等待并不停的进行锁请求,检查该自旋锁是 否已经被线程B释放,直到得到这个锁为止。因为自旋锁不会引起调用者睡眠,所以自旋锁的效率远 高于互斥锁。

    虽然它的效率比互斥锁高,但是它也有些不足之处:

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

    在用自旋锁时有可能造成死锁,当递归调用时有可能造成死锁。

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

  • 相关阅读:
    CentOS 出错处理
    g13 root
    修复误删系统文件
    c++ list sort方法
    批量修改outlook联系人头像,并同步手机
    IT大牛们 学术搜索
    oracle 表空间操作
    CentOS 5.5 安装MPICH2\MRNet\Launchmon时遇到的问题
    自我反省
    积累航程
  • 原文地址:https://www.cnblogs.com/crbhf/p/15138095.html
Copyright © 2011-2022 走看看