atomic相关内容

布尔读/写操作在 x86 上不是原子的吗?

假设我们有两个线程,一个在循环中读取 bool,另一个可以在特定时间切换它.我个人认为这应该是原子的,因为 C++ 中的 sizeof(bool) 是 1 个字节,您不会部分读/写字节,但我想 100% 确定. 是还是不是? 编辑: 为了将来参考,同样适用于 int 吗? 解决方案 这完全取决于您对“原子"一词的实际含义. 您的意思是“最终值将一次性更新"(是的,在 ..
发布时间:2021-11-30 14:47:22 C/C++开发

如何在不使用 <mutex> 的情况下在 C++11 中实现多线程安全单例

既然 C++11 具有多线程,我想知道在不使用互斥体的情况下实现延迟初始化单例的正确方法是什么(出于性能原因).我想出了这个,但是我不太擅长编写无锁代码,所以我正在寻找一些更好的解决方案. //ConsoleApplication1.cpp :定义控制台应用程序的入口点.//# 包含 # 包括# 包含# 包括使用命名空间标准;单例类{民众:单例(){}stat ..
发布时间:2021-11-30 14:46:55 C/C++开发

“原子"是什么意思?在编程中是什么意思?

在 Effective Java 一书中,它指出: 语言规范保证读或写一个变量是原子的,除非变量是 long 或 double [JLS,17.4.7]. 在 Java 编程或一般编程的上下文中,“原子"是什么意思? 解决方案 举个例子:假设 foo 是一个 long 类型的变量,那么下面的操作不是原子操作(在 Java 中): foo = 65465498L; 实际上,变 ..
发布时间:2021-11-30 14:46:45 Java开发

std::atomic 究竟是什么?

我知道 std::atomic 是一个原子对象.但是原子到什么程度呢?据我了解,操作可以是原子的.使对象原子化到底是什么意思?例如,如果有两个线程并发执行以下代码: a = a + 12; 那么整个操作(比如add_twelve_to(int))是原子的吗?或者是否对变量 atomic 进行了更改(所以 operator=())? 解决方案 std::atomic 表示不同线程可以同时 ..
发布时间:2021-11-30 14:46:36 C/C++开发

混合 C++11 原子和 OpenMP

OpenMP 有自己对原子访问的支持,但是,首选 C++11 原子至少有两个原因:它们明显更加灵活并且它们是标准的一部分.另一方面,OpenMP 比 C++11 线程库更强大. 该标准在两个不同的章节中指定了原子操作库和线程支持库.这让我相信原子访问的组件与使用的线程库是正交的.我真的可以将 C++11 原子和 OpenMP 结合起来吗? Stack Overflow 上有一个非常类似 ..
发布时间:2021-11-30 14:46:24 C/C++开发

SQL Server 2005 中的原子 UPSERT

在 SQL Server 2005 中执行原子“UPSERT"(存在时更新,否则插入)的正确模式是什么? 我在 SO 上看到很多代码(例如,请参阅 检查是否一行存在,否则插入) 具有以下两部分模式: 更新...从 ...WHERE-- 这里有竞争条件风险如果@@ROWCOUNT = 0插入 ... 或 IF (SELECT COUNT(*) FROM ... WHERE ) = ..
发布时间:2021-11-30 14:46:07 数据库

x86 上的原子性

8.1.2 总线锁定 Intel 64 和 IA-32 处理器提供一个 LOCK# 信号,该信号被断言在某些关键内存操作期间自动锁定系统总线或等效链路.当这个输出信号被断言时,来自其他处理器或总线代理的总线控制请求被阻止.软件可以指定其他场合当LOCK语义之后是将 LOCK 前缀添加到说明. 它来自英特尔手册,第 3 卷 听起来像内存上的原子操作将直接在内存(RAM)上执行.我很 ..
发布时间:2021-11-30 14:45:59 C/C++开发

Cuda 原子更改标志

我有一段串行代码可以做这样的事情 if( !variable ){在这里做一些初始化变量 = 真;} 我知道这在串行中工作得很好,并且只会执行一次.在 CUDA 中,哪种原子操作是正确的? 解决方案 在我看来,您想要的是代码中的“关键部分".临界区允许一个线程执行一系列指令,同时阻止任何其他线程或线程块执行这些指令. 临界区可用于控制对内存区域的访问,例如,以允许单个线程无冲突地 ..
发布时间:2021-11-30 14:45:49 其他开发

英特尔内存模型是否使 SFENCE 和 LFENCE 变得多余?

英特尔内存模型保证: 商店不会与其他商店重新订购 负载不会与其他负载重新排序 http://bartoszmilewski.com/2008/11/05/who-ordered-memory-fences-on-an-x86/ 我看到有人声称由于 Intel 内存模型,SFENCE 在 x86-64 上是多余的,但从来没有 LFENCE.上述内存模型规则是否使任一指令变得多余? ..
发布时间:2021-11-30 14:45:40 其他开发

Django:如何防止并发修改数据库条目

是否有办法防止两个或多个用户同时修改同一个数据库条目? 向执行第二次提交/保存操作的用户显示错误消息是可以接受的,但不应以静默方式覆盖数据. 我认为锁定条目不是一种选择,因为用户可能会使用“返回"按钮或干脆关闭他的浏览器,从而永远保持锁定状态. 解决方案 这就是我在 Django 中进行乐观锁的方式: updated = Entry.objects.filter(Q(id=e ..
发布时间:2021-11-30 14:45:28 其他开发

x86 CMPXCHG 是原子的,如果是,为什么需要 LOCK?

英特尔文档 说 该指令可以与 LOCK 前缀一起使用,以允许指令自动执行. 我的问题是 CMPXCHG 可以用内存地址操作吗?从文档看来不是,但谁能确认只适用于寄存器中的实际 VALUE,而不适用于内存地址? 如果CMPXCHG 不是原子的,并且必须通过LOCK CMPXCHG(使用LOCK)实现高级语言级别的CAS前缀),引入这样的指令的目的是什么? (我是从高级语 ..
发布时间:2021-11-30 14:45:21 其他开发

引用分配是原子的,为什么需要 Interlocked.Exchange(ref Object, Object) ?

在我的多线程 asmx Web 服务中,我有一个属于我自己类型 SystemData 的类字段 _allData,它由几个标记为 List 和 Dictionary 组成代码>易失性.系统数据 (_allData) 会不时刷新,我通过创建另一个名为 newData 的对象并用新数据填充它的数据结构来实现.完成后我只分配 private static volatile SystemData _al ..
发布时间:2021-11-30 14:45:12 C#/.NET

dbms中的原子性是什么

我在 DBMS 的 1NF 形式中读到类似下面的内容. 有一句话是这样的: “每一列都应该是原子的." 谁能用一个例子向我彻底解释一下? 解决方案 “每一列都应该是原子的." Chris Date 说,“请非常小心地注意,合法值不仅仅是像整数 3 这样简单的东西.相反,值可以是任意复杂的;例如,一个值可能是几何点、多边形、X 射线、XML 文档、指纹、数组、堆栈 ..
发布时间:2021-11-30 14:45:03 其他开发

C# 中哪些操作是原子操作?

有没有一种系统的方法可以知道 C# 中的操作是否是原子的?或者是否有任何一般准则或经验法则? 解决方案 关于更完整/更详细的内容: 读取和写入 32 位值类型是原子的:这包括以下固有值(结构)类型:bool、char、byte、sbyte、short、ushort、int、uint、float.以下类型(以及其他类型)不能保证是原子的:decimal、double、long、ulon ..
发布时间:2021-11-30 14:44:53 C#/.NET

SSE指令:哪些CPU可以做原子16B内存操作?

考虑 x86 CPU 上的单个内存访问(单个读取或单个写入,而不是读取 + 写入)SSE 指令.该指令正在访问 16 个字节(128 位)的内存,并且访问的内存位置对齐到 16 个字节. 文档“英特尔® 64 位架构内存订购白皮书"指出,对于“读取或写入地址在 8 字节边界上对齐的四字(8 字节)的指令",内存操作似乎作为单个内存执行访问与内存类型无关. 问题:是否存在 Intel/A ..
发布时间:2021-11-30 14:44:44 其他开发

文件附加在 UNIX 中是原子的吗?

一般来说,当我们在 UNIX 中从多个进程追加到一个文件时,我们可以认为什么是理所当然的?是否可能丢失数据(一个进程覆盖另一个进程的更改)?数据是否有可能被破坏?(例如,每个进程在日志文件中每次追加一行,是否有可能两行被破坏?)如果追加不是上述意义上的原子,那么确保互斥的最佳方法是什么? 解决方案 小于 'PIPE_BUF' 大小的写入应该是原子的.这应该至少是 512 字节,尽管它很容易变大 ..
发布时间:2021-11-30 14:44:32 服务器开发

为什么在 x86 上自然对齐的变量原子上的整数赋值是原子的?

我一直在阅读关于原子操作的这篇文章,并提到 32 位整数赋值在 x86 上是原子的,只要变量自然对齐即可. 为什么自然对齐可以保证原子性? 解决方案 “自然"对齐意味着对齐到它自己的类型宽度.因此,加载/存储永远不会跨越任何比自身更宽的边界(例如页面、缓存行,或者用于不同缓存之间数据传输的更窄的块大小). CPU 经常以 2 的幂大小的块的形式在内核之间执行缓存访问或缓存线传输 ..
发布时间:2021-11-30 14:44:23 C/C++开发

什么时候在多线程中使用 volatile?

如果有两个线程访问一个全局变量,那么许多教程说使变量可变,以防止编译器将变量缓存在寄存器中,从而无法正确更新.然而,两个线程都访问一个共享变量是需要通过互斥锁来保护的,不是吗?但是在那种情况下,在线程锁定和释放互斥锁之间,代码处于临界区,只有那个线程可以访问变量,在这种情况下变量不需要是 volatile 吗? 那么在多线程程序中 volatile 的用途/目的是什么? 解决方案 S ..
发布时间:2021-11-30 14:44:05 C/C++开发

Java 中的哪些操作被认为是原子操作?

Java 中的哪些操作被认为是原子操作? 解决方案 除了 long 和 double 之外的所有原始类型赋值 参考文献的所有分配 所有可变变量的赋值 java.concurrent.Atomic* 类的所有操作 也许还有更多.查看 jls. 正如评论中所指出的,原子性并不意味着可见性.因此,虽然保证另一个线程不会看到部分写入的 int,但它可能永远不会看到新值. l ..
发布时间:2021-11-25 16:09:36 Java开发