注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

火车的家

Put first thing first

 
 
 

日志

 
 

2012.12.16 barrier() 的作用  

2012-12-16 15:42:41|  分类: linux kernel |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

barrier() 的作用之一是确保指令的执行顺序不会被编译器打乱。比如下文的代码(取自:http://blog.csdn.net/sailor_8318/article/details/2870184)。

void __lockfunc _spin_unlock(spinlock_t *lock)
{
    spin_release(&lock->dep_map, 1, _RET_IP_);
    _raw_spin_unlock(lock);
    preempt_enable();
}
EXPORT_SYMBOL(_spin_unlock);

void __lockfunc _spin_lock(spinlock_t *lock)
{
    preempt_disable();
    spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
    _raw_spin_lock(lock);
}
EXPORT_SYMBOL(_spin_lock);

//在这里barrier为了确保inc_preempt_count()执行之后才执行后面的代码,则阳后面的代码就不会被抢占。
#define preempt_disable() /
do { /
    inc_preempt_count(); /
    barrier(); /
} while (0)

#define preempt_enable_no_resched() /
do { /
    barrier(); /
    dec_preempt_count(); /
} while (0)

#define preempt_check_resched() /
do { /
    if (unlikely(test_thread_flag(TIF_NEED_RESCHED))) /
        preempt_schedule(); /
} while (0)

//这个宏里面每一条语句都用barrier隔离开,这么做的原因有二,一是为了保证之前的每条语句都执行完之后才打开抢占以避免被过早地抢占,二是为了保证这个宏里面每条语句的执行顺序。
#define preempt_enable() /
do { /
    preempt_enable_no_resched(); /
    barrier(); /
    preempt_check_resched(); /
} while (0)
  评论这张
 
阅读(485)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017