首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当std::atomic<T>::is_always_lock_free为false时,std::atomic<T>对中断安全吗?

当std::atomic<T>::is_always_lock_free为false时,std::atomic<T>对中断安全吗?
EN

Stack Overflow用户
提问于 2018-06-12 23:24:06
回答 1查看 1.2K关注 0票数 8

在没有操作系统的嵌入式(ARM)环境中,如果我使用中断,那么使用std::atomic<T>会出现死锁吗?如果是这样的话,是怎么做的?

一般来说,在任何时刻,控制都可以被中断来处理中断。特别是,如果一个人天真地拥有一个互斥锁,并且想用它来对一个变量进行“安全”,那么他可能会锁定它、写入和解锁,然后在别处锁定、读取和解锁。但如果读取是在中断中,你可以锁定,中断,锁定=>死锁。

特别是,我有一个std::atomic<int>,它的is_always_lock_freefalse。我应该担心死锁的情况吗?当我查看生成的程序集时,编写42看起来像这样:

代码语言:javascript
复制
bl __sync_synchronize
mov r3, #42
str r3, [sp, #4]
bl __sync_synchronize

看起来不像是锁着的。读取该值的asm类似。是像exchange这样的花里胡哨的操作的(可能)锁

EN

回答 1

Stack Overflow用户

发布于 2018-06-13 00:05:25

__sync_synchronize只是一个完全内存屏障的builtin。没有涉及到锁定,因此不会像互斥和中断处理程序那样存在死锁的可能性。

您使用的ARM内核是什么?在ARM Cortex-A7上,下面的代码为两个都打印true

代码语言:javascript
复制
#include <iostream>
#include <atomic>

int main()
{
   std::atomic<int> x;
   std::cout << std::boolalpha << x.is_lock_free() << std::endl;
   std::cout << std::atomic<int>::is_always_lock_free << std::endl;
}

我希望std::atomic<int>在ARM上实现时大部分都没有锁,当然从你提供的程序集来看,它似乎没有使用锁。

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

https://stackoverflow.com/questions/50820710

复制
相关文章

相似问题

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