首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >i386架构下Linux内核原子操作读写

i386架构下Linux内核原子操作读写
EN

Stack Overflow用户
提问于 2014-03-05 18:10:20
回答 2查看 207关注 0票数 0
代码语言:javascript
运行
复制
    static __inline__ int atomic_dec_and_test(atomic_t *v)
{
    unsigned char c;

    __asm__ __volatile__(
        LOCK "decl %0; sete %1"
        :"=m" (v->counter), "=qm" (c)
        :"m" (v->counter) : "memory");
    return c != 0;
} 

这个实现让我很困惑,这个函数中的原子是什么意思?只有减少的部分吗?但是我们如何确保sete返回正确的值呢?我们需要在函数调用this ?中禁用中断,原子似乎只针对此函数中的一句话(Decl),而不是整个函数?

EN

回答 2

Stack Overflow用户

发布于 2014-03-05 18:29:06

v是一个原子变量。对该变量的访问必须是原子的。decl指令是该函数中唯一访问v的指令,因此它是唯一需要确保原子访问的指令。之后,基于decl的结果设置局部变量(因此不能被不同的CPU/上下文访问)。

所以atomic_dec_and_test()意味着以原子方式递减一个原子变量,并测试这是否会导致达到零值。

票数 2
EN

Stack Overflow用户

发布于 2014-03-05 19:57:37

我不知道您正在查看哪个版本的Linux内核代码(我没有找到您在当前内核版本上发布的代码片段,在最近的内核中,它已被LOCK_PREFIX取代),但请尝试找出LOCK代表什么,它被定义为宏。我相信您会在cpu宏中找到lock指令,它告诉LOCK以原子方式执行后面的指令look here。特别是下面这行:

代码语言:javascript
运行
复制
In a multiprocessor environment, the LOCK# signal insures that the processor has 
exclusive use of any shared memory while the signal is asserted.

请注意,它是对任何共享内存的独占使用。我认为这是关键。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22194592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档