在ARM架构上,遗憾的是我不确切知道它是什么芯片,是32位int读/写原子?
对基本类型的读/写有什么保证吗?
我正在构建一个使用System.IO.File.Copy(...)函数复制文件的服务器应用程序.我的文件可能相当大,因此,如果机器崩溃,它很有可能在复制期间发生.
重新启动服务后,我应该能够获取复制任务并继续.如何检测服务器崩溃是否成功完成或中断了副本?
我目前的计划是将文件复制到临时名称,复制完成后将其重命名为最终名称.这样,文件命名能够在崩溃时携带状态信息.
你有什么好的/更好的建议吗?
编辑:目标操作系统是Win2003,因此事务NTFS不可用
不使用显式事务,是:
update tokens set tokens = tokens + 1
Run Code Online (Sandbox Code Playgroud)
保证在InnoDB中是原子的吗?
请考虑以下代码:
#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)
即使它是另一个线程完美定义的行为,可以同时更改已完成的变量.
Delphi 10.2(支持Linux)具有跨平台功能AtomicExchange,相当于Windows InterlocekdEchange.到现在为止还挺好...
我必须使用没有AtomicExchangeAdd等效的InterlockedExchangeAdd来移植Win32代码.
我的问题是:在为Linux编译时,我可以使用什么来替换InterlockedExchangeAdd?
STD的全部特::原子为整数类型提供算术组合赋值运算符,例如+=,-=但没有*=或/=.标准说明了这一点,但据我所知,没有理由给出.熟悉原子操作图书馆部分背后原因的人是否可以对此有所了解?
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处理器确认并且不跨不同架构共享编译代码是不对的,根本不需要同步 …
使用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关系.
我问的是类似的东西,但不完全一样,因为我想知道的是依赖于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)