gpt4 book ai didi

c - 什么时候使用 pthread_spin_lock 是正确的(例如 pthread mutex)?

转载 作者:太空狗 更新时间:2023-10-29 16:20:35 25 4
gpt4 key购买 nike

鉴于 pthread_spin_lock 可用,我什么时候使用它,什么时候不应该使用它们?

即我将如何决定使用 pthread 互斥锁或 pthread 自旋锁来保护某些共享数据结构?

最佳答案

简短的回答是,当您计划在极短的时间间隔内持有锁(例如除了增加计数器什么也不做)时,自旋锁可能会更好,并且预期争用很少见,但操作正在发生通常足以成为潜在的性能瓶颈。自旋锁相对于互斥锁的优点是:

  1. 解锁时,无需检查是否有其他线程可能正在等待锁定并唤醒它们。解锁只是一个原子写指令。
  2. 未能立即获得锁不会使您的线程进入休眠状态,因此一旦它可用,它可能能够以更低的延迟获得锁。
  3. 进入内核空间休眠或唤醒其他线程不存在缓存污染的风险。

第 1 点将始终成立,但如果您认为良好的互斥锁实现可能会在请求内核等待帮助之前旋转相当多的次数,则第 2 点和第 3 点的用处会有所减弱。

现在,长答案:

在使用自旋锁之前,您需要问自己的是,这些潜在的优点是否超过了一个罕见但非常真实的缺点:当持有锁的线程在释放锁之前被调度程序中断时会发生什么。这当然很少见,但即使只是为单个变量增量操作或其他同样微不足道的操作持有锁,也会发生这种情况。在这种情况下,任何其他试图获取锁的线程都将继续旋转,直到持有锁的线程被调度并有机会释放锁。 这可能永远不会发生如果尝试获取锁的线程比持有锁的线程具有更高的优先级。这可能是一个极端的情况,但即使没有不同的优先级,在锁拥有者再次被安排之前可能会有很长的延迟,最糟糕的是,一旦这种情况开始,它会迅速升级尽可能多的线程,所有线程都希望获取锁,开始对其进行自旋,占用更多的处理器时间,并进一步延迟可以释放锁的线程的调度。

因此,我会小心使用自旋锁...:-)

关于c - 什么时候使用 pthread_spin_lock 是正确的(例如 pthread mutex)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6603404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com