标签: atomicity

正在运行时中断汇编指令

当中断到达 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

4
推荐指数
2
解决办法
1081
查看次数

Clang 不内联 std::atomic::load 以加载 64 位结构

考虑以下代码,它使用 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)

c++ atomic clang atomicity stdatomic

4
推荐指数
1
解决办法
180
查看次数

为什么不能交换 std::atomic&lt;T&gt; ?

#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>换?

c++ standards std atomicity c++11

4
推荐指数
1
解决办法
212
查看次数

C++中的无锁数据结构比较和交换例程

在本文中:无锁数据结构(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基础,那么下次有什么东西"预期"它是某种特定方式,而事实并非如此.但是,这并没有改变它可能发生的事实,在这种情况下,它仍然是原子的吗?如果另一个演员的变化被这个演员覆盖了,那么另一个演员回归真实呢?如果那不可能发生,为什么呢?

我想相信作者,所以我在这里错过了什么?我认为这一定是显而易见的.如果这看起来微不足道,我提前道歉.

c++ lock-free atomicity

3
推荐指数
1
解决办法
1579
查看次数

有没有理由不总是使用AtomicInteger作为数据成员?

在像Android这样的多线程环境中,一个简单的int变量可能被多个线程操纵,在哪些情况下仍然有理由使用int一个数据成员?

一个int作为局部变量,不限于具有到它的独占访问的方法的范围内(并因此启动&修改它的完成是总是在相同的线程),非常有意义的性能代价.

但作为数据成员,即使由访问器包装,它也会遇到众所周知的并发交错修改问题.

所以看起来"玩得安全"可以全面使用AtomicInteger.但这看起来非常低效.

你能带一个线程安全int数据成员用法的例子吗?

java performance multithreading atomicity

3
推荐指数
1
解决办法
1334
查看次数

Python解包线程安全吗?

x,y = self.mytuple在Python中是一个像atomic 一样的操作吗?

或者可以self.mytuple在赋值期间由另一个线程修改,导致x引用self.mytuple的第一个版本,y引用第二个版本?

我正在使用Python 3.

python multithreading atomic thread-safety atomicity

3
推荐指数
1
解决办法
140
查看次数

关于volatile和Atomic类的一些疑问?

我将通过Java线程书.我发现了这个说法

声明1: - "volatile变量只能安全地用于单个加载或存储操作,不能应用于long或double变量.这些限制使得volatile变量的使用不常见"

我没有得到单个加载或存储操作在这里意味着什么?为什么挥发性不能应用于长或双变量?

声明2: - "易失性整数不能与++运算符一起使用,因为++运算符包含多个指令.AtomicInteger类有一个方法允许它保持的整数以原子方式递增."

为什么易失整数不能与++运算符一起使用以及AtomicInteger如何解决它?

java multithreading volatile atomicity

3
推荐指数
1
解决办法
123
查看次数

C++ 11 std :: atomic <T>拷贝构造函数的线程安全性

我正在处理我的原子容器的一些问题并看到了这个链接.

有没有理由说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)

c++ multithreading atomic atomicity c++11

3
推荐指数
1
解决办法
1361
查看次数

Django 并发 get_or_create

我担心一件事。
使用 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,我准备好了吗?必须研究隔离、事务、原子性?或者更多的是关于锁定桌子?如何(单元)测试它?

请指导我。

python mysql django transactions atomicity

3
推荐指数
1
解决办法
1751
查看次数

我可以同时复制一个shared_ptr吗?

我知道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)

c++ multithreading shared-ptr atomicity c++11

3
推荐指数
1
解决办法
180
查看次数