zoukankan      html  css  js  c++  java
  • 为了防止不同的cpu抢占同一段代码(即同一段内存地址),需要用自旋锁将这段代码锁住。

    自旋锁(spinlock)是用在多个CPU系统中的锁机制,当一个CPU正访问自旋锁保护的临界区时,临界区将被锁上,其他需要访问此临界区的CPU只能忙等待,直到前面的CPU已访问完临界区,将临界区开锁。自旋锁上锁后让等待线程进行忙等待而不是睡眠阻塞,而信号量是让等待线程睡眠阻塞。自旋锁的忙等待浪费了处理器的时间,但时间通常很短,在1毫秒以下。

    自旋锁用于多个CPU系统中,在单处理器系统中,自旋锁不起锁的作用,只是禁止或启用内核抢占。在自旋锁忙等待期间,内核抢占机制还是有效的,等待自旋锁释放的线程可能被更高优先级的线程抢占CPU。 

    自旋锁使用方法如下:

    spinlock_t my_lock

    void spin_lock_init(spinlock_t *lock);

    void spin_lock(spinlock_t *lock);

    //code here

    void spin_unlock(spinlock_t *lock);

    持有自旋锁的代码在任何情况下都不能放弃CPU,否则很可能引起系统死锁,因此若这段代码有可能切换应用,则不能使用自旋锁,而必须使用互斥锁。

    互斥锁使用方法如下:

    static struct mutex toggle_mutex;

    mutex_init(&toggle_mutex);

    mutex_lock(&toggle_mutex);

    //code here

    mutex_unlock(&toggle_mutex);

    另外,结构体变量在声明时被分配内存空间,这点与int、long等变量不同。

  • 相关阅读:
    CH4302 Interval GCD
    20201017 模拟赛总结
    LOJ#2610. 「NOIP2013」货车运输
    POJ3696 The Luckiest number
    20200925 小练习总结
    更新一波状态
    AFO
    【扩展lucas定理】
    【LCT维护子树信息】uoj207 共价大爷游长沙
    [bzoj4589]Hard Nim(FWT快速沃尔什变化+快速幂)
  • 原文地址:https://www.cnblogs.com/yiru/p/2985125.html
Copyright © 2011-2022 走看看