在 BSD 提供的原子操作中(在 atomic(9) 手册页中给出),有 atomic_load_acq_int() 和 atomic_store_rel_int()。在寻找其他操作系统的等效项时(例如,通过阅读 Mac OS X 的 atomic(3) 手册页,Solaris 的 atomic_ops(3C) 手册页,和 Windows 的 Interlocked*() 函数),似乎没有任何(明显的)等价物用于原子地读/写 int。
这是因为它暗示那些为 int 读/写的操作系统默认保证是原子的吗? (或者你必须在 C/C++ 中使用 declare them volatile 吗?)
如果不是,那么如何在这些操作系统上对 int 进行原子读/写?
(可以通过返回原子加 0 的结果来模拟原子读取,但是没有等效的原子写入。)
最佳答案
我觉得你们混在一起了atomic memory access与 cache coherence .前者是在软件中构建同步原语(自旋锁、信号量和互斥量)所需的硬件支持,而后者是对工作在同一总线上的多个芯片(多个 CPU 和外围设备)的硬件支持,并且具有主内存的一致 View 。
不同的编译器/库为第一个提供不同的实用程序。例如,这里是 GCC intrinsics for atomic memory access .它们都归结为生成 compare-and-swap或 load-linked/store-conditional基于指令 block 取决于平台支持。编译您的源代码,例如,为 GCC 使用 -S 并查看生成的汇编器。
您不必为缓存一致性明确地做任何事情——它都在硬件中处理——但它肯定有助于理解它是如何工作的,以避免像 cache line ping-pong 这样的事情发生。 .
有了这一切, aligned 单个单词的读取和写入在所有商品平台上都是原子的(如果我在这里错了,请有人纠正我)。由于 int 的大小小于或等于处理器字,因此您已被覆盖(请参阅上面的 GCC 内置链接)。
重要的是读写的顺序。这就是架构内存模型很重要的地方。它规定了硬件可以和不能对哪些操作进行重新排序。示例是更新链表——在项目本身处于一致状态之前,您不希望其他 CPU 看到链接的新项目。明确 memory barriers (通常也称为“内存栅栏”)可能是必需的。 Acquire 屏障确保后续操作不会在屏障之前重新排序(假设您在项目内容之前读取链表项目指针),Release 屏障确保之前的操作在屏障之后不会重新排序(您在写入新链接指针之前写入项目内容)。
volatile 经常被误解为与上述所有内容相关。事实上,它只是告诉编译器不要在寄存器中缓存变量值,而是在每次访问时从内存中读取它。许多人认为它是 "almost useless"用于并发编程。
很抱歉回复冗长。希望这会稍微清除它。
即将推出的 C++0x 标准最终解决了并发问题,请参阅 Hans Boehm's C++ memory model papers了解更多详情。
关于windows - BSD 以外的操作系统的原子加载/存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3223602/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co
我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.
电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。 准备工作: 1、U盘一个(尽量使用8G以上的U盘)。 2、一台正常联网可使用的电脑。 3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。 4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。 U盘启动盘制作步骤: 注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m