标签: atomicity

ARM:从int atomic写/读?

在ARM架构上,遗憾的是我不确切知道它是什么芯片,是32位int读/写原子?

对基本类型的读/写有什么保证吗?

c arm atomicity

12
推荐指数
1
解决办法
7919
查看次数

.NET下的原子文件复制

我正在构建一个使用System.IO.File.Copy(...)函数复制文件的服务器应用程序.我的文件可能相当大,因此,如果机器崩溃,它很有可能在复制期间发生.

重新启动服务后,我应该能够获取复制任务并继续.如何检测服务器崩溃是否成功完成或中断了副本?

我目前的计划是将文件复制到临时名称,复制完成后将其重命名为最终名称.这样,文件命名能够在崩溃时携带状态信息.

你有什么好的/更好的建议吗?

编辑:目标操作系统是Win2003,因此事务NTFS不可用

.net robustness file-transfer atomicity

11
推荐指数
1
解决办法
2811
查看次数

在InnoDB中'更新令牌设置tokens = tokens + 1'原子?

不使用显式事务,是:

update tokens set tokens = tokens + 1
Run Code Online (Sandbox Code Playgroud)

保证在InnoDB中是原子的吗?

mysql innodb thread-safety atomicity

11
推荐指数
1
解决办法
1841
查看次数

原子操作和原子事务

有人可以向我解释,原子操作和原子交易之间的区别是什么?在我看来,这两个是相同的.这是正确的吗?

atomicity

11
推荐指数
3
解决办法
7404
查看次数

C++ 11内存模型是否允许从循环中提升放松的原子载荷?

请考虑以下代码:

#include <atomic>

extern std::atomic<int> i;

void f(void)
{
  while (!i.load(std::memory_order_relaxed))
      ;
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找C++ 11标准的引用,该标准表明编译器不允许将循环转换为

  if (!i.load(std::memory_order_relaxed)) {
    while (1)
      ;
  }
Run Code Online (Sandbox Code Playgroud)

我在这里看过一些讨论,但没有结论.

编辑:这篇文章的先前版本称为循环内部的外部函数.

编辑2:动机:"Effective Java"一书说HotSpot VM执行以下转换:

while (!done)
    i++;
Run Code Online (Sandbox Code Playgroud)

if (!done)
    while (true)
        i++;
Run Code Online (Sandbox Code Playgroud)

即使它是另一个线程完美定义的行为,可以同时更改已完成的变量.

c++ atomic atomicity c++11

11
推荐指数
1
解决办法
485
查看次数

使用Delphi 10.2等效的InterlockedExchangeAdd for Linux

Delphi 10.2(支持Linux)具有跨平台功能AtomicExchange,相当于Windows InterlocekdEchange.到现在为止还挺好...

我必须使用没有AtomicExchangeAdd等效的InterlockedExchangeAdd来移植Win32代码.

我的问题是:在为Linux编译时,我可以使用什么来替换InterlockedExchangeAdd?

linux delphi atomicity

11
推荐指数
2
解决办法
410
查看次数

为什么std :: atomic <integral>特化不提供乘法和除法赋值运算符?

STD的全部特::原子为整数类型提供算术组合赋值运算符,例如+=,-=但没有*=/=.标准说明了这一点,但据我所知,没有理由给出.熟悉原子操作图书馆部分背后原因的人是否可以对此有所了解?

c++ multithreading atomic atomicity c++11

10
推荐指数
1
解决办法
731
查看次数

字节码指令与处理器操作之间的关系

Java规范保证原始变量赋值总是原子的(期望long和双精度)types.

相反,对应于着名的增量操作的获取和添加操作i++将是非原子的,因为导致读 - 修改 - 写操作.

假设这段代码:

public void assign(int b) {
    int a = b;
}
Run Code Online (Sandbox Code Playgroud)

生成的字节码是:

public void assign(int);
    Code:
       0: iload_1       
       1: istore_2      
       2: return 
Run Code Online (Sandbox Code Playgroud)

因此,我们看到赋值由两个步骤组成(加载和存储).

假设这段代码:

public void assign(int b) {
        int i = b++;
}
Run Code Online (Sandbox Code Playgroud)

字节码:

public void assign(int);
    Code:
       0: iload_1       
       1: iinc          1, 1    //extra step here regarding the previous sample
       4: istore_2      
       5: return 
Run Code Online (Sandbox Code Playgroud)

知道X86处理器可以(至少是现代处理器)以原子方式操作增量操作,如上所述:

在计算机科学中,fetch-and-add CPU指令是一种特殊指令,它以原子方式修改存储器位置的内容.它用于在多处理器系统中实现互斥和并发算法,信号量的泛化.

因此,第一个问题:尽管字节码需要两个步骤(加载和存储),但是Java依赖于这样的事实:赋值操作是一个操作,无论处理器的体系结构如何都始终以原子方式执行,因此可以确保永久原子性(对于原始赋值) )在其规格?

第二个问题:用非常现代的X86处理器确认并且不跨不同架构共享编译代码是不对的,根本不需要同步 …

java x86 bytecode processor atomicity

10
推荐指数
2
解决办法
887
查看次数

在Django 1.8中创建多个没有多次匹配到db的对象

使用Django 1.8,如何在单个db事务中创建多个对象并写入db?

似乎以前的版本有@commit_manually.但是当我尝试修改此代码时:https://stackoverflow.com/a/29834940我得到一个例外

django.db.transaction.TransactionManagementError: The outermost 'atomic' block cannot use savepoint = False when autocommit is off.
Run Code Online (Sandbox Code Playgroud)

在我看过很多帖子中说要用"with transaction.atomic()"块包装,但这会在每个循环中击中db.

这是我的代码的简化版本.我没有运行它,但它应该显示我正在尝试做什么.

class Foo(models.Model):
    Name = models.CharField( max_length=200 )

class Bar(models.Model):
    Foos = models.ManyToManyField( foo )

class Processor(object):
    def run(self,):
        myBar = Bar.object.create()

        myList = ['a', 'b', 'c', 'd']

        if True:
            set_autocommit( False )

            for char in myList:
                myFoo = Foo.objects.create(Name=char)
                myBar.Foos.add( myFoo )

            commit()
            set_autocommit( True )
Run Code Online (Sandbox Code Playgroud)

我正在尝试进行所有这些更改,只打了一次db.我知道有model.objects.bulk_create,但我找不到处理m2m关系的方法.另外bulk_create不会返回db实例,因此我必须将它们从m2中拉出来以获取m2m关系.

database django transactions atomicity

10
推荐指数
1
解决办法
6457
查看次数

rename()原子性和NFS?

参考:rename()是原子的吗?

我问的是类似的东西,但不完全一样,因为我想知道的是依赖于rename()使用NFS时的原子性是否安全?

这是我正在处理的一个场景 - 我有一个必须始终存在的'索引'文件.

所以:

  • 客户端创建一个新文件
  • 客户端通过"旧"索引文件重命名新文件.

独立客户:

  • 读取索引文件
  • 指的是基于索引的磁盘结构.

这假设rename()是原子意味着 - 总会有一个'索引'文件(尽管它可能是一个过时的版本,因为缓存和时间)

然而我遇到的问题是 - 这是在NFS上发生的 - 并且正在工作 - 但是我的几个NFS客户端偶尔会报告"ENOENT" - 没有这样的文件或目录.(例如,在以5米间隔发生的数百次操作中,我们每隔几天就会收到此错误).

所以我希望是否有人可以启发我 - 在这种情况下,实际上是否真的无法获得'ENOENT'?

我问的原因是RFC 3530中的这个条目:

RENAME操作必须是客户端的原子操作.

我想知道这是否只是发出重命名的客户端,而不是查看目录的客户端?(我对缓存/过时的目录结构没问题,但是这个操作的重点是这个文件总是以某种形式"存在")

操作顺序(来自执行写操作的客户端)是:

21401 14:58:11 open("fleeg.ext", O_RDWR|O_CREAT|O_EXCL, 0666) = -1 EEXIST (File exists) <0.000443>
21401 14:58:11 open("fleeg.ext", O_RDWR) = 3 <0.000547>
21401 14:58:11 fstat(3, {st_mode=S_IFREG|0600, st_size=572, ...}) = 0 <0.000012>
21401 14:58:11 fadvise64(3, 0, 572, POSIX_FADV_RANDOM) = 0 <0.000008> …
Run Code Online (Sandbox Code Playgroud)

linux nfs atomicity

10
推荐指数
3
解决办法
2662
查看次数