当中断到达 CPU 时,如果它被确认,则通过在跳转到处理程序之前保存当前地址位置来处理它。否则将被忽略。
我想知道汇编指令调用是否被中断。
例如,
mvi a, 03h ; put 3 value into acc. in 8080 assembly
Run Code Online (Sandbox Code Playgroud)
一行指令可以中断吗?或者如果不是,它是原子的?
是否总能保证“一行汇编指令”总是原子的?
如果8080汇编中没有“lock”关键字呢,那么原子性是如何提供的呢?
例如,如果要操作64位和,但是“一行指令”没有办法做到,并且在对和进行操作时出现中断怎么办?如何在装配级别防止它?
对我来说,这个概念正在开始归结。
assembly interrupt cpu-architecture atomicity interrupted-exception
考虑以下代码,它使用 astd::atomic原子地加载 64 位对象。
#include <atomic>
struct A {
int32_t x, y;
};
A f(std::atomic<A>& a) {
return a.load(std::memory_order_relaxed);
}
Run Code Online (Sandbox Code Playgroud)
使用 GCC,好事发生了,并生成了以下代码。( https://godbolt.org/z/zS53ZF )
f(std::atomic<A>&):
mov rax, QWORD PTR [rdi]
ret
Run Code Online (Sandbox Code Playgroud)
这正是我所期望的,因为我看不出为什么在这种情况下 64 位结构不能像任何其他 64 位字一样被对待。
但是,对于 Clang,情况就不同了。Clang 生成以下内容。( https://godbolt.org/z/d6uqrP )
f(std::atomic<A>&): # @f(std::atomic<A>&)
push rax
mov rsi, rdi
mov rdx, rsp
mov edi, 8
xor ecx, ecx
call __atomic_load
mov rax, qword ptr [rsp]
pop rcx
ret
mov rdi, rax
call __clang_call_terminate
__clang_call_terminate: # @__clang_call_terminate
push rax …Run Code Online (Sandbox Code Playgroud) #include <atomic>
int main()
{
auto a = std::atomic_int(1);
auto b = std::atomic_int(2);
std::swap(a, b); // error
}
Run Code Online (Sandbox Code Playgroud)
错误信息:
错误:没有用于调用“swap(std::atomic&, std::atomic&)”的匹配函数
为什么不能std::atomic<T>换?
在本文中:无锁数据结构(pdf)显示以下"比较和交换"基础:
template <class T>
bool CAS(T* addr, T exp, T val)
{
if (*addr == exp)
{
*addr = val;
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
然后说
整个过程都是原子的
但那是怎么回事?是否有可能其他一些演员可以改变作业和作业addr之间的价值if?在这种情况下,假设所有代码都使用了这个CAS基础,那么下次有什么东西"预期"它是某种特定方式,而事实并非如此.但是,这并没有改变它可能发生的事实,在这种情况下,它仍然是原子的吗?如果另一个演员的变化被这个演员覆盖了,那么另一个演员回归真实呢?如果那不可能发生,为什么呢?
我想相信作者,所以我在这里错过了什么?我认为这一定是显而易见的.如果这看起来微不足道,我提前道歉.
在像Android这样的多线程环境中,一个简单的int变量可能被多个线程操纵,在哪些情况下仍然有理由使用int一个数据成员?
一个int作为局部变量,不限于具有到它的独占访问的方法的范围内(并因此启动&修改它的完成是总是在相同的线程),非常有意义的性能代价.
但作为数据成员,即使由访问器包装,它也会遇到众所周知的并发交错修改问题.
所以看起来"玩得安全"可以全面使用AtomicInteger.但这看起来非常低效.
你能带一个线程安全int数据成员用法的例子吗?
x,y = self.mytuple在Python中是一个像atomic 一样的操作吗?
或者可以self.mytuple在赋值期间由另一个线程修改,导致x引用self.mytuple的第一个版本,y引用第二个版本?
我正在使用Python 3.
我将通过Java线程书.我发现了这个说法
声明1: - "volatile变量只能安全地用于单个加载或存储操作,不能应用于long或double变量.这些限制使得volatile变量的使用不常见"
我没有得到单个加载或存储操作在这里意味着什么?为什么挥发性不能应用于长或双变量?
声明2: - "易失性整数不能与++运算符一起使用,因为++运算符包含多个指令.AtomicInteger类有一个方法允许它保持的整数以原子方式递增."
为什么易失整数不能与++运算符一起使用以及AtomicInteger如何解决它?
我正在处理我的原子容器的一些问题并看到了这个链接.
有没有理由说std :: atomic不是可复制构造的?解决方案似乎就是这样,他们只是将T值传递给具有原子加载功能的非原子构造函数(如果我没有弄错的话).
那么一般来说,这个拷贝构造函数线程是否安全?
template<typename T>
struct MobileAtomic
{
std::atomic<T> atomic;
explicit MobileAtomic(std::atomic<T> const& a) : atomic(a.load()) {}
};
Run Code Online (Sandbox Code Playgroud) 我担心一件事。
使用 Django 1.7(大多数默认安装中的 MySQL)我正在向 Django REST Framework 发送 POST APIView。那边我在做:
try:
MyModel.objects.get(**some_kwargs)
except MyModel.DoesNotExist:
MyModel.objects.custom_create(**some_kwargs) # This also creates relative models
Run Code Online (Sandbox Code Playgroud)
现在,如果我要执行大量并发请求,会发生什么?
正如我猜你所期望的,我只想要第一个并发请求来创建一个对象,其他任何请求都应该得到创建的对象。
感谢 Django,我准备好了吗?必须研究隔离、事务、原子性?或者更多的是关于锁定桌子?如何(单元)测试它?
请指导我。
我知道shared_ptr在2个单独的线程中复制和重置单个是有问题的,但是2个线程试图创建同一个shared_ptr对象的副本呢.它需要同步吗?参考计数器在这里是否正常工作?
std::shared_ptr<T> global_t(new T());
// Thread 1
std::shared_ptr<T> t1(global_t);
do something with t1
// Thread 2
std::shared_ptr<T> t2(global_t);
do something with t2
Run Code Online (Sandbox Code Playgroud)