在一个词中存储一个地址和一个bool,用于无锁双链表
我正在阅读一些纸张,以供双链接链接列表. 在这些论文中,它们存储了下一步的地址和一个单词(int)中的prev节点和标志. 是因为在32位体系结构中,所有地址都在4个字节边界中对齐,因此所有地址均为4? 的多个地址 ,如果原因是我说这个代码可以吗? const int dMask = 1; const int pMask = ~dMask; int store(void* pPointer, bool pDel) { return reinterpret_cast(pPointer) | (int)pDel; } void load(int pData, void** pPointer, bool* pDel) { *pPointer = reinterpret_cast(pData & pMask); *pDel = pData & dMask; } 和另一个问题:在其他平台(例如Android移动设备)中进行操作
2 2024-02-11
编程技术问答社区
用Python/Boto更新DynamoDB原子计数器
我正在尝试使用Python Boto 2.3.0更新原子计数计数器,但找不到该操作的文档. 似乎没有直接接口,所以我尝试使用Layer1接口转到" RAW"更新,但是我甚至无法完成一个简单的更新. 我尝试了以下变体,但全部没有运气 dynoConn.update_item(INFLUENCER_DATA_TABLE, {'HashKeyElement': "9f08b4f5-d25a-4950-a948-0381c34aed1c"}, {'new': {'Value': {'N':"1"}, 'Action': "ADD"}}) dynoConn.update_item('influencer_data', {'HashKeyElement': "9f08b4f5-d25a-4950-a948-0381c34aed1c"},
4 2024-01-24
编程技术问答社区
DynamoDB中原子计数器的可靠性
我正在考虑在我的应用程序中使用 amazon dynamodb ,我对其我正在构建一个分布式应用程序,需要同时,并且始终如一,增量/减少一个存储在发电机属性中的计数器. 我想知道,在繁重的并发环境中,迪纳摩的原子计数器有多可靠,并发级别非常高(例如,平均速率为20k并发命中 - 为了获得这个想法,这将是近520亿次增量/每月减少). 计数器应该是超级可靠的, 都错过了命中.有人在这样的关键环境中测试了DynamoDB吗? 谢谢 解决方案 dynamodb通过将键跨多个服务器拆分,从而获得了缩放属性.这类似于Cassandra和HBase量表等其他分布式数据库.虽然您可以增加DynamoDB上的吞吐量,该DynamoDB仅将数据移至多个服务器,现在每个服务器都可以处理总共并发连接/服务器数量.看看 问:我将始终能够达到我的配备水平? Amazon DynamoDB假设所有主要键都相对随机访问模式.您应该设置数据模型,以便您的请求会导致跨主键的流量分布相当均匀.如
0 2024-01-24
编程技术问答社区
为什么对24位结构的写入不是原子性的(而对32位结构的写入似乎是)?
我是一个修补匠 - 不怀疑这一点.因此,我最近做了一些实验,以确认我的怀疑写信给struct不是原子操作,这是一种原子操作"试图强制执行某些约束的价值类型可能会以其目标失败. 我写了博客文章有关此的博客文章插图: struct SolidStruct { public SolidStruct(int value) { X = Y = Z = value; } public readonly int X; public readonly int Y; public readonly int Z; } 虽然上面的看起来就像X != Y或Y != Z永远不可能的类型,但实际上,如果值为值为值,则会发生这种 can 中间分配"同时,它被单独的线程复制到另一个位置. 好,大.好奇心,几乎没有.但是后来我有了这种直觉:我的64位CPU 真的应该能够原子上复制64位,对吗?那么,如果我摆脱了Z,只是粘在X和Y上怎么
2 2024-01-24
编程技术问答社区
C++ Treiber 堆栈和原子下一个指针
" treiber stack "最简单的无锁数据结构,因此在教授无锁算法的介绍时通常会使用它. 我已经看到了使用C ++原子学的许多树木堆栈实现.该算法本身是微不足道的,因此真正的挑战是处理所有无锁数据结构的其他偶然细节,例如提供某种方法来执行安全的记忆填海,避免ABA问题,并以无锁的方式分配节点.这可以通过各种方式解决,例如使用原子参考计数,危险指针,计数/标记的指针避免ABA,并使用无锁的内存池. 但忽略所有这些细节并关注简单的算法本身,我想到的一个问题是,我可以回忆起的每一个treiber堆栈的实现都使用 atomic next pointers 实现了节点类别 .例如: struct Node { T value; std::atomic next; }; 但是在考虑算法之后,我不确定为什么下一个指针需要原子. 通用推动算法(忽略无锁分配,安全记忆填海,退缩,避免ABA等)是: Node* n = new Node();
2 2024-01-23
编程技术问答社区
在符合POSIX标准的文件系统对象上进行比较和交换
有几种操作,符合POSIX的操作系统可以通过文件系统对象(文件和文件夹)进行原子能完成.这是此类可能是原子操作 : 重命名或移动文件或文件夹 创建HardLink 创建符号 创建文件夹 创建并打开一个空文件 是否可以根据这些操作来构建对文件进行比较和S-wap算法? 让我们假设我们有几个过程,这些过程正在执行在单个文件上同时读/写.文件以其修订为特征.假设修订版已添加到文件名中,并且文件可以使用该文件来读取该文件.这些过程无法(由于某些原因)与静音,信号量等同步,但它们能够创建辅助文件和文件夹.他们是否能够对文件进行基于修订的比较和划分修改(创建一个新文件,创建和重命名symlink),这意味着,如果几个过程要同时修改它,那么成功,其余的将会成功,其余使用一些错误代码失败? 该算法必须抵抗在算法的任何步骤中突然终止任何过程. 解决方案 哦,男孩. 让我们假设每个过程都可以访问唯一标识符,以避免打破对称性问题.这是一次性共识对象的无等待实现.
2 2024-01-22
编程技术问答社区
为什么比较和交换(CAS)算法是无锁同步的好选择?
cas属于读取 - 修改 - 写入(rmw)家族,这是一组算法,使您可以原子进行复杂的交易. 特别是,维基百科说 CAS用于实现同步原始分子,例如信号量和静音,以及更复杂的无锁和无候补算法. [...] CAS可以实现更多的这些算法,而不是原子读,写或获取和添加,并假设大量内存,[...]可以实现所有这些. 交换#概述 因此,CAS算法似乎是其类别的"一件尺寸适合所有尺寸"产品.为什么会这样?其他RMW算法缺乏什么?如果CAS是最好的工具,那么其他算法是什么? 解决方案 cas属于称为"共识对象"的对象类别,每个对象都有共识号.给定共识对象可以解决共识问题的最大线程数量. 共识问题是这样的:对于某些线程n,提出了一些值p并决定提出的值之一d,以便n线程在d上同意. cas是最"强大"共识的对象,因为其共识数是无限的.也就是说,CAS可用于解决理论上无限数量的线程之间的共识问题. 它甚至以候补的方式进行. 这无法使用原子寄存器,测试和设置,
0 2024-01-22
编程技术问答社区
被异步ajax回调扰乱的 "原子 "操作
我知道,使用JavaScript和" Atomic"单词相同句子中的任何东西都很奇怪,因为JavaScript被认为是异步的,因此不是很原子. //编辑 这是我身边的错误!通过使警报熄灭(并隐藏在Chrome中的进一步警报)中,它很快中断并让其他代码飞行. JavaScript是单线线程. 快速 - >实际问题; 在哪种情况下,我们从异步回调中断中断中断,我们如何防止某些代码块? 长 - >我的场景; 我的整个应用程序都是非常递归的,并且触发了许多AJAX请求,这些请求会在返回时触发更多的递归功能,这些功能可能触发更多的AJAX请求. 在我的代码中,我对数组进行了一些非常关键的操作,必须在下一个操作之前完成(虽然简单的推送/剪接逻辑). 我遇到了问题,我在数组中获得了键的索引,并将其保存在变量中.然后,我将其比较为-1,如果是真的,我对数组中的元素进行了剪接(不仅符合). 现在,在获得索引和剪接之间,异步回调返回结果并开始递归内容,然后通过添加/删除更多项目来更改
6 2024-01-20
编程技术问答社区
是否有任何原子性的javascript操作来处理Ajax'的异步性质?
我正在从服务器中动态加载代码(功能),并将其执行为JavaScript代码,然后将其存储在数组中并执行.所有这些代码段必须精确执行一次. psuedocode遵循这样的 function fetch(foo){ if (foo in fooArray){ //Do Nothing else{ //Fetch foo via Ajax and execute foo() } } 问题要复杂得多,但是从本质上讲,如果我发出以下命令 fetch('someFunctionName'); fetch('someFunctionName'); fetch('someFunctionName'); fetch('someFunctionName'); 全部四个将执行if (foo in fooArray)并假定它不在数组中,并且所有四个都将继续获取代码并执行该代码.我记得当天学习信号量和静音,有javaScript的
2 2024-01-20
编程技术问答社区
32/64位jvm上的java原语的大小?
int的大小为32位,long/double是64位.这些尺寸会在 32/64位JVM 32/64位处理器 如果是的,则在long/double上的操作将在64位处理器/JVM上是原子? oracle java tutorial说: 读取和写入是参考变量和大多数原始变量的原子(除长和双重的所有类型). 此语句与JVM/处理器体系结构有任何关系吗? 有人可以解释吗? 3.最后,如果我使用64位JVM和处理器 解决方案 是的,在32位和64位JVM上的尺寸均相同.在Java中,不能保证分配长或双倍的原子.原子分配,仍然不能保证其他线程可见性.由于允许线程在内存中"阴影"变量,因此即使是原子分配到变量的分配也不一定是对主内存的写入(但是当主机已更新时,它将在原子上进行此操作).您必须在从两个或多个线程访问共享状态时,如果您期望一个线程始终如一地看到另一个线程时,请始终使用某种同步壁垒. 其他解决方案 唯一更改大小的数据类型是参考.这些可以是32
2 2024-01-08
编程技术问答社区
64位应用程序在64位Windows上的64位操作是否是原子性的?
因此,该文档说运行64位Windows为您提供64位原子性: http://msdn.microsoft.com/en-us/library/windows/desktop/mss684122%28v=vs.85%29.85%29.85%29.aspx > 这篇文章表明您必须运行一个64位应用才能获得64位原子性: Atomicity在32/64位 我正在开发Win32控制台应用程序.因此,如果正确理解,我必须使用32位类型来获得原子,对吗?我不能以为64位类型具有原子写入/读取? 解决方案 在64位应用程序中,64位读取/写入操作可以是自动的,因为编译器可以利用具有原子64位读取/写入操作的X64扩展指令集. 另一方面生成(至少)两个读/写操作.因为操作系统可以在两个读取/写入之间抢占过程,所以您应该使用Interlockedxxx api. 注意:您 can 构建 64-bit win32控制台应用如果需要.在这种情况下,编译器可以生成使用64位读/写OP的代
8 2024-01-08
编程技术问答社区
在64位的cpu上,64位数值的读/写是否是原子性的?
在32位计算机上,.net中64位值的读写曾经是非原子的,即在阅读时,我可以阅读一个从未写入记忆的值,由一个较老的32--组成钻头一半,一个较新的一半. 但在64位CPU上读取/写入原子? 如果是这样,(Windows)OS也必须是64位? ,如果是这样,即使该应用也必须是64位.NET构建? 解决方案 来自这个答案,如果您使用64位系统并且使用64位的CLR ,然后它们是原子.答案引用了此博客文章来自Eric Lippert: https://blogs.msdn.microsoft.com/ericlippert/2011/05/05/31/atomicity-yatomicity-volatility-and-immmutiality-and-immmutability-rare-rare-rare-are-different-part-part-two/ /p> CLI规范实际上可以提供更强的保证. CLI保证的读写和写作是价值类型的变量,即处理器自然指针
4 2024-01-08
编程技术问答社区
.net的System.MemberwiseClone和互锁的写法
执行一系列价值类型的成员Wiseclone时: var arr = new double[100]; 如果使用其他线程上的互锁写入对这些双重进行修改,会员Wisecloned副本是否有可能撕裂双打的风险?我不担心具有略微过时的值,只是撕裂和互锁和成员之间的相互作用(我想这转化为内存闪电类型操作?) 解决方案 是.在32位操作系统上,这甚至可以保证有撕裂的风险.在64位,它是定义的.我不会轻易冒险,因为即使您测试它没有发生,您的测试也仅在您的特定.NET版本和特定的硬件上. 您无法真正确定. 在64位上,您可以通过实现自己的克隆来可靠地防止撕裂(这可能不会慢得多).
6 2024-01-07
编程技术问答社区
并发的文件.同一文件的移动
可以清楚地说明文件是原子操作: file.move.move . 但是以下代码段将导致多次移动同一文件的可见性. 有人知道此代码怎么了吗? using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; namespace FileMoveTest { class Program { static void Main(string[] args) { string path = "test/" + Guid.NewGuid().ToString(); CreateFile(path, new string('a', 10 * 1024 * 1024)); var tasks = new List();
0 2024-01-06
编程技术问答社区
参考尺寸结构的原子赋值
快速问题...假设我有一个包含单个参考成员的C#struct.该结构原子在.NET中的作业吗?例如: struct ReadOnlyList { private List list; // other random functionality }; 我知道普通的旧参考分配是原子的,只是好奇是否将整个内容包裹在结构中会有任何区别... 谢谢 解决方案 12.5变量参考的原子性 阅读和写作以下数据类型应为原子:布尔,char,byte,sbyte,short,ushort,uint,uint,int,float和参考类型.此外,上一个列表中具有基础类型的枚举类型的读写和写作也应为原子.阅读和写作其他类型,包括长,乌隆,双重和十进制以及用户定义的类型,不必是原子.除了为此目的而设计的库功能外,也不能保证原子读取模式写入,例如增加或减少. 因此,具有唯一的参考类型成员的结构分配的原子性是定义的,您不应依靠它.
2 2024-01-06
编程技术问答社区
C#线程安全静态成员
我有一个带有静态成员的C#类,该类别从多个线程中读取并写在一个线程中. 据我所知,uint64读写并不是所有系统上的原子操作,因此我必须手动保证线程安全性. 我有一些关于如何执行此操作的想法. 与原子包装班一起进行,例如C ++中的STD :: Atomic. C# 中是否实现了类似的东西 使用带有静态场的挥发性修饰符.但是,这是不允许的.为什么? 我终于做了以下内容: private static object tick_time_lock; private static UInt64 _currentTickTime; public static UInt64 CurrentTickTime { get { return _currentTickTime; } set { lock (tick_time_lock) { _curren
8 2024-01-05
编程技术问答社区
我怎样才能在C#中进行原子写入/追加,或者我怎样才能让文件以FILE_APPEND_DATA标志打开?
在大多数Unixes和Posix下,执行开放式操作系统调用的操作系统与O_Append一起向操作系统指示写作是原子化的附加和写作操作.有了这种行为,对于本地文件系统进行写入时,您知道它会附加到文件的末尾. Windows操作系统通过在适当的参数中传递到Win32 CreateFile()系统调用来支持相同的功能. 参考: http://www.google.com/search?q=msdn+createfile or: http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx http://www.google.com/search?q=msdn+IoCreateFileSpecifyDeviceObjectHint or: http://www.google.com/search?q=msdn+IoCreateFileSpecifyDeviceObjectHint 我的问题是,我无法确定如何使用网
0 2024-01-03
编程技术问答社区
在.NET中对无对齐字段的读写肯定是原子的吗?
c#规范( ecma-334 =" http://standards.iso.org/ittf/publiclyavailableblestandards/c042926_iso_iec_23270_2006%28e%29.zip"> iso/iec 23270 ) 12.5变量参考的原子性 阅读和写作以下数据类型应为原子:布尔,char,byte,sbyte,short,ushort,uint,uint,int,float和参考类型.此外,上一个列表中具有基础类型的枚举类型的读写和写作也应为原子.读和写作其他类型,包括长,乌尔隆,双重和十进制以及用户定义的类型,不必是原子. ,但是我很难想象这总是正确的.例如,我可以使用 StructLayout attribute ,并迫使田地不结盟: // sizeof(MyStruct) == 9 [StructLayout(LayoutKind.Sequential, Pack = 1)] struct MyStruct
18 2024-01-03
编程技术问答社区
.NET下的原子文件复制
我正在构建一个服务器应用程序,该应用程序使用System.io.file.copy(...)函数复制文件.因此,我的文件可能很大,因此,如果机器崩溃,则在复制过程中发生. 发生. 重新启动服务后,我应该能够掌握复制任务并继续.如何检测服务器崩溃成功完成或中断副本? 我当前的计划是将文件复制到临时名称,然后复制完成后,将其重命名为最终名称.这样,文件命名能够在崩溃上携带状态信息. 您有什么好/更好的建议吗? 编辑:目标操作系统是Win2003,因此不可用ntfs 解决方案 其他建议的交易NTF,如果您在Vista上部署或更高版本,这很好.如果您需要支持XP(或更早),则临时文件,然后移动(重命名)是最好的解决方案. 这个类似问题的答案提供了更多信息: file.move.move 其他解决方案 交易文件系统. 其他解决方案 Windows的新版本允许您使用
2 2024-01-03
编程技术问答社区
为什么没有接受Doubles作为参数的Interlocked.Add的重载?
我完全感谢螺纹中间类提供的原子.但是,我不明白为什么添加功能只提供两个过载:一个用于整数,另一个用于渴望.为什么不加倍或任何其他数字类型? 很明显,更改双重的预期方法是比较change;我猜这是因为修改双重操作比修改整数更复杂.我仍然不清楚为什么,如果compareexchange和add可以接受整数,他们也不能同时接受双打. 解决方案 互锁的类包裹在Windows API互锁**功能上. 这些又是使用X86的锁定说明前缀来围绕本机处理器API包裹.它仅支持前缀以下说明: BT,BTS,BTR,BTC,XCHG,XADD,ADD或,ADC,SBB和,SUB,XOR,NOT,NOT,NEG,INC,DEC 您会注意到,这些又几乎将其映射到互锁的方法.不幸的是,此处不支持非全能类型的添加功能.在64位平台上支持64位朗. 这是一篇很棒的文章在说明级别上讨论锁定语义. 其他解决方案 其他人已经解决了"为什么?".但是,使用CompareExchan
0 2024-01-03
编程技术问答社区