如何确保在互斥锁期间由多个 CPU 内核写入的数据在所有内核的所有 L1 缓存中同步?我说的不是代表锁的变量,我说的是锁期间涉及的内存位置。
这是针对 Linux,x86_64,我的代码是:
#include <sys/types.h>
#include "dlog.h"
uint *dlog_line;
volatile int dlog_lock;
char *dlog_get_new_line(void) {
uint val;
while(!__sync_bool_compare_and_swap(&dlog_lock, 0, 1)) {
val=*dlog_line;
if (val==DT_DLOG_MAX_LINES) val=0;
*dlog_line=val;
}
dlog_lock = 0;
}
在这里,在 dlog_get_new_line() 函数中,我使用了 gcc 内置函数,因此获取锁应该没有任何问题。但是我如何确保当锁被释放时,*dlog_line 指向的值传播到系统中所有其他 CPU 内核的所有 L1 缓存中?
我不使用 pthreads,每个进程运行在不同的 cpu 内核上。
最佳答案
你感兴趣的是cache coherence . 这是由硬件自动完成的。
简而言之,如果您正确使用 __sync_bool_compare_and_swap()(或任何其他内在锁定),则无需执行任何操作。
作为一个过于简单化的解释,线程不会从对 __sync_bool_compare_and_swap() 的调用中返回,直到所有其他处理器能够看到新值或意识到它们的本地副本已超出-日期。
如果您对底层(在硬件中)发生的事情感兴趣,可以使用各种缓存一致性算法来确保核心不会读取过时的数据副本。
以下是部分常用协议(protocol)列表:
现代硬件通常会有更复杂的算法。
关于c - 内置 gcc 自旋锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8716178/
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
我已经开始了:defsplit_array(array,size)index=0results=[]ifsize>0whileindex如果我在[1,2,3,4,5,6]上运行它,比如split_array([1,2,3,4,5,6],3)它将产生这个数组:[[1,2,3],[4,5,6]]。在Ruby1.8.7中是否已经有可用的东西可以做到这一点? 最佳答案 [1,2,3,4,5,6].each_slice(3).to_a#=>[[1,2,3],[4,5,6]]对于1.8.6:require'enumerator'[1,2,3,4
如果我想要“00001”而不是“1”,除了我自己写填零方法之外,有没有内置的方法可以帮助我为整数填零? 最佳答案 puts"%05d"%1#00001参见:String::%,Kernel::sprintf这是正在发生的事情。%左侧的"%05d"是C风格的格式说明符。%右边的变量就是要格式化的东西。格式说明符可以像这样解码:%-格式说明符的开头0-用前导零填充5-长度为5个字符d-被格式化的是一个整数如果你要格式化多个东西,你会把它们放在一个数组中:"%d-%s"%[1,"One"]#=>1-one
我正在尝试编写一个Ruby扩展,而且我一整天都在成功编译我的nmatrix.so共享对象文件。但是,突然之间,它开始生成nmatrix.bundle,而根本没有任何.so文件。它没有给我任何链接器错误,所以我无法想象为什么会这样。我也没有更改myMakefileorextconf.rb中的任何内容.我一直通过rvm使用Ruby1.9.3p0。我已经尝试对当天的工作执行gitstashsave并编译一些我知道应该没有链接器错误的东西(产生.so的东西)更早。不幸的是,这也会生成一个.bundle文件。很明显,我做了一些事情——可能是无意中安装了一些东西——这改变了一些关键的GCC设置。这
我有两个Foo对象列表。每个Foo对象都有一个时间戳,Foo.timestamp。两个列表最初都按时间戳降序排列。我想以最终列表也按时间戳降序排序的方式合并Foo对象的两个列表。实现这个并不难,但我想知道是否有任何内置的Ruby方法可以做到这一点,因为我认为内置方法会产生最佳性能。谢谢。 最佳答案 这会起作用,但不会提供很好的性能,因为它不会利用事先已经排序的列表:list=(list1+list2).sort_by(&:timestamp)我不知道有任何内置函数可以满足您的需求。 关于
如果有定义的内置ruby方法,是否总是使用内置方法更可取?如果我有这样的代码:ifi==0使用内置的ruby方法有什么好处?ifi.zero? 最佳答案 i.zero?仅在i为Numeric时有效对象。i=nili==0#=>falsei.zero?#NoMethodError:undefinedmethod`zero?'fornil:NilClass#from(irb):5#fromC:/Ruby200-x64/bin/irb:12:in`' 关于ruby-内置的Ruby方法,
为什么Ruby的内置JSON不能反序列化简单的JSON原语,我该如何解决这个问题?irb(main):001:0>require'json'#=>trueirb(main):002:0>objects=[{},[],42,"",true,nil]#=>[{},[],42,"",true]irb(main):012:0>objects.eachdo|o|irb(main):013:1*json=o.to_jsonirb(main):014:1>beginirb(main):015:2*pJSON.parse(json)irb(main):016:2>rescueException=>ei
Unity内置渲染管线、SRP、URP、HDRP的关系:Unity渲染管线包含内置渲染管线和SRP,内置渲染管线是Unity默认的渲染管线,不可修改;而SRP是可以用户自己控制渲染流程;URP和HDRP则相当于Unity提供的SRP模板。内置渲染管线(Build-InRender):内置渲染管线是Unity默认的渲染管线,兼容Unity面向的所有平台,但渲染次序是固定的,效果不突出。SRP(ScriptableRenderPipline):可编程渲染管线,核心是一堆API集合,使得整个渲染过程及相关配置暴露给用户,使得用户可以精确地控制项目的渲染流程。用户可以直接利用Unity的URP、HDR
我有一个程序,一次创建10000个线程,并同时运行8个线程。但是ruby没有像Java那样内置的线程池。有充分的理由吗? 最佳答案 可能是因为使用标准库“Queue”类很容易推出您自己的。q=Queue.new3.times{Thread.new{whilesomething=q.pop(true)rescuenil;...}不过这是一个很好的问题——我可能会建议将其与RubyCore一起提出。 关于ruby-为什么Ruby没有内置ThreadPool?,我们在StackOverfl
我在不受信任的网络(咖啡店、邻居的开放式wifi、DEFCON)上进行了大量的Web开发,当随机的、肯定有错误的软件(比如我正在开发的Rails应用程序)在0.0上绑定(bind)一个端口时,我会感到紧张.0.0并开始接受所有来者的请求。我知道我可以使用-b选项指定绑定(bind)到服务器的地址,但我想全局更改默认值,以便它始终以这种方式运行,除非我另有说明。当然我也可以运行某种会阻止连接的防火墙,但最好不要一开始就监听。是否有“.railsrc”文件或类似文件——至少是每个项目的设置文件,但最好是一些全局设置文件——我可以使用它来强制服务器默认仅绑定(bind)到127.0.0.1?