孤独memories 2024-01-25 23:41 采纳率: 0%
浏览 14

对于ARM底层原子操作的看法问题,读书读不懂哇?

不是很理解,按照我的理解来看,CPU0最先执行LDREX指令时候,获取了全局监视器和CPU0的本地监视器都看作是1,完了CPU0最先执行STREX之后,释放了全局监视器和本地监视器,就看做都是0把,然后CPU1在T2时LDREX发现全局监视器已经为1,然后设置本地监视器为1,到T4时,全局监视器已经被CPU0置为0了,就无法在共享数据区存数据了,所以失败的不应该是CPU1吗,为什么书上说的是失败的CPU0呢

img

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2024-01-26 08:07
    关注

    【以下回答由 GPT 生成】

    对于ARM底层原子操作,我的理解是在多线程或多进程并发访问共享资源时,确保操作的原子性,即不被中断或干扰的一种机制。ARM处理器提供了一些特殊的指令,例如LDREX和STREX,用于实现原子操作。

    在多CPU并发访问共享数据区时,如果CPU0执行的LDREX指令成功,在执行STREX指令之前,CPU1执行了一次对共享数据的修改,那么CPU0的STREX指令就会失败。这是因为STREX指令会检查共享数据在执行LDREX指令后是否发生修改,如果发生了修改,STREX指令就会失败。

    为了解决这个问题,可以使用循环重试的方式来保证原子操作的完成。具体步骤可以如下:

    1. 使用LDREX指令加载共享数据到寄存器,同时将结果保存到另一个寄存器。

    2. 执行处理逻辑,对共享数据进行修改。

    3. 使用STREX指令尝试将处理后的数据写回到共享数据区。

    4. 检查STREX指令的执行结果,如果成功,则说明原子操作完成,退出循环。如果失败,则说明共享数据被其他CPU修改过,重新回到步骤1。

    下面是一个示例代码片段,演示了如何使用LDREX和STREX指令来实现原子操作的循环重试:

    #include <stdint.h>
    
    volatile uint32_t sharedData = 0;  // 共享数据
    
    void atomicOperation() {
        uint32_t oldValue, newValue;
    
        do {
            // 步骤1:使用LDREX指令加载共享数据
            __asm__ volatile ("LDREX %[oldValue], [%[sharedData]]"
                              : [oldValue] "=r" (oldValue)
                              : [sharedData] "r" (&sharedData));
    
            // 步骤2:处理逻辑,对共享数据进行修改
            newValue = oldValue + 1;
    
            // 步骤3:使用STREX指令尝试写回共享数据
            __asm__ volatile ("STREX %[isSuccess], %[newValue], [%[sharedData]]"
                              : [isSuccess] "=r" (isSuccess)
                              : [newValue] "r" (newValue), [sharedData] "r" (&sharedData));
    
        // 步骤4:检查STREX指令的执行结果
        } while (isSuccess == 0);
    }
    

    这是一个简单的示例,演示了如何使用LDREX和STREX指令来实现原子操作的循环重试。在实际应用中,可能还需要考虑线程同步、内存屏障等其他因素,以确保并发访问的正确性和性能。对于更复杂的问题,可能需要结合具体情况进行分析和优化。

    希望以上内容可以对您有所帮助,如果还有其他问题,请随时提问。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 1月25日

悬赏问题

  • ¥15 模电中二极管,三极管和电容的应用
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络