在我的多线程ASMX web服务,我有我自己的类型SystemData的类别字段_allData它由数List<T>
和Dictionary<T>
标记为volatile
.系统data(_allData
)会偶尔刷新一次,我会通过创建另一个被调用的对象newData
并用新数据填充它的数据结构来实现.当它完成后我就分配了
private static volatile SystemData _allData
public static bool LoadAllSystemData()
{
SystemData newData = new SystemData();
/* fill newData with up-to-date data*/
...
_allData = newData.
}
Run Code Online (Sandbox Code Playgroud)
这应该工作,因为赋值是原子的,并且具有对旧数据的引用的线程继续使用它,而其余的在分配之后具有新的系统数据.然而,我的同事说,volatile
我应该使用,而不是使用关键字和简单的InterLocked.Exchange
分配,因为他说在某些平台上,不能保证引用赋值是原子的.另外:当我宣布the _allData
字段volatile
的
Interlocked.Exchange<SystemData>(ref _allData, newData);
Run Code Online (Sandbox Code Playgroud)
产生警告"对易变场的引用不会被视为不稳定的"我应该怎么看待这个?
一般来说,当我们从多个进程附加到UNIX中的文件时,我们可以理所当然地认为什么?是否有可能丢失数据(一个进程会覆盖其他进程)?数据是否可能被破坏?(例如,每个进程在每个追加到日志文件时附加一行,是否有可能两行被破坏?)如果追加在上述意义上不是原子的,那么确保互斥的最佳方法是什么?
不是atomic<bool>
多余的,因为bool
它本质上是原子的吗?我认为不可能有部分修改的bool值.我什么时候真的需要用atomic<bool>
而不是bool
?
我无法通过实验检查这一点,也无法从手册页中收集它.
假设我有两个进程,一个从directory1移动(重命名)file1到directory2.假设另一个并发运行的进程将directory1和directory2的内容复制到另一个位置.是否有可能以这样的方式发生复制:directory1和directory2都将显示file1 - 即在移动之前复制directory1,在第一个进程移动之后复制directory2.
基本上是rename()是一个原子系统调用?
谢谢
我一直在REST API中使用POST来创建对象.每隔一段时间,服务器就会创建一个对象,但客户端会在收到201 Created
响应之前断开连接.客户端只能看到失败的POST请求,稍后再次尝试,服务器会愉快地创建一个重复的对象......
其他人一定有这个问题吧?但我谷歌周围,每个人似乎都忽略了它.
我有2个解决方案:
A)改为使用PUT,并在客户端上创建(GU)ID.
B)向客户端上创建的所有对象添加GUID,并让服务器强制执行UNIQUE
-ness.
A与现有框架不匹配,B感觉就像是黑客.在现实世界中,其他人如何解决这个问题?
编辑:
使用Backbone.js,您可以在客户端上创建对象时将GUID设置为id.保存后,Backbone将执行PUT请求.让你的REST后端处理PUT到不存在的id,然后你就设置了.
我在汇编语言级别获得了指令集架构,提供了比较和交换以及类似的操作.但是,我不明白芯片是如何提供这些保证的.
正如我想象的那样,指令的执行必须
是什么阻止了另一个核心在第一次获取内存地址之后但在设置新值之前访问内存地址?内存控制器是否管理这个?
编辑:如果x86实现是秘密的,我会很高兴听到任何处理器家族如何实现它.
是否有Redis数据结构,它允许弹出(获取+删除)多个元素的原子操作,它包含多个元素?
有众所周知的SPOP或RPOP,但它们总是返回单个值.因此,当我需要来自set/list的前N个值时,我需要调用命令N次,这很昂贵.假设集/列表包含数百万个项目.是否有类似的东西SPOPM "setName" 1000
,它会返回并从集合中删除1000个随机项目,或者RPOPM "listName" 1000
从列表中返回1000个最右边的项目?
我知道有像SRANDMEMBER和LRANGE这样的命令,但它们不会从数据结构中删除项目.它们可以单独删除.但是,如果有更多客户端从同一数据结构中读取,则可以多次读取一些项目,并且可以在不读取的情况下删除一些项目!因此,原子性是我的问题所在.
此外,如果这种操作的时间复杂性更昂贵,我也没关系.我怀疑它会比发布N(比如上一个例子中的1000,N)单独请求Redis服务器更昂贵.
我也知道单独的交易支持.但是,来自Redis docs的这句话不鼓励我将它用于修改集合的并行进程(从中破坏性地读取):
当使用WATCH时,EXEC只有在未修改被监视的键时才会执行命令,允许进行检查和设置机制.
最近我正在阅读一个教程,因为我发现了一个声明说...
"Java语言规范保证读取或写入变量是一个原子操作(除非变量是类型long
或者double
).类型的操作变量long
或double
只有在用volatile
关键字声明时才是原子的."
AtomicInteger
或AtomicLong
提供类似的方法getAndDecrement()
,getAndIncrement()
以及getAndSet()
哪些是原子方法.
我对上述陈述感到困惑.你能澄清何时使用 AtomicInteger
或AtomicLong
上课.