首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >整数中位的并发修改

整数中位的并发修改
EN

Stack Overflow用户
提问于 2010-11-09 13:34:29
回答 2查看 223关注 0票数 0

我想知道如果我试图从多个线程中设置字符/整数中的位,我会丢失任何修改吗?我一开始会有全零,线程只会把它设置为1。系统架构是x64。

谢谢,Gokul。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-09 13:37:44

在x64 (和x86)上,int上的操作是原子的。这意味着读取和写入是独立的原子操作,而不是组合在一起。(例如,如果您有两个线程同时写入一个int,您将不会看到一个线程的一半和另一个线程的一半--您总是会看到一个完整的int或另一个。)

但是,读取和写入是两个独立的操作。您可以执行一些互锁的操作(导致读和写是一个原子操作),但我不相信按位逻辑属于可以以这种方式执行的操作集。

我认为如果你想让这个操作是原子的,你必须锁定一些互斥/监视器并执行读/写操作。

票数 3
EN

Stack Overflow用户

发布于 2010-11-09 14:36:35

您必须使用互斥或类似的同步机制,或者使用原子操作。对于前者,有现成的POSIX和Windows库,而且非常标准。对于后者,大多数编译器都会提供一些函数(例如http://gcc.gnu.org/wiki/Atomic)、内联汇编模式或其他方便的方式来使用它们,而且您总是可以退回到链接到从汇编语言编译的对象。

你肯定无法避免这种显式的同步。即使以某种方式对CPU核心最内层内存缓存中的值进行XOR操作(实际上并非如此),您也需要确保该值与其他CPU核心的缓存同步。只有那些显式同步缓存的CPU指令才对您有用-通过上面提到的库选项之一使用它们是最容易的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4130806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档