• 为了防止不同的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等变量不同。

  • 相关阅读:
    Tableau如何绘制堆叠柱状图
    Tableau如何绘制多边形地图
    Tableau如何绘制凹凸图
    数据库备份策略设计
    MySQL数据库如何实现增量备份
    Tableau如何绘制瀑布图
    创建.net core ef项目
    asp.net core的ef的连接字符串
    sqlserver的varchar nvarchar区别
    jq的ajax请求写法
  • 原文地址:https://www.cnblogs.com/yiru/p/2985125.html
Copyright © 2020-2023  润新知