为啥 CompareAndSwap 比 TestAndSet 更强大的指令?

     2023-02-16     65

关键词:

【中文标题】为啥 CompareAndSwap 比 TestAndSet 更强大的指令?【英文标题】:Why CompareAndSwap is more of a powerful instruction than TestAndSet?为什么 CompareAndSwap 比 TestAndSet 更强大的指令? 【发布时间】:2013-10-28 05:57:24 【问题描述】:

请考虑下面的 CompareAndSwap 代码,让我知道为什么这个原子指令比作为互斥原语的原子 TestAndSet 更强大?

char CompareAndSwap(int *ptr, int old, int new) 
unsigned char ret;
// Note that sete sets a ’byte’ not the word
__asm__ __volatile__ (
" lock\n"
" cmpxchgl %2,%1\n"
" sete %0\n"
: "=q" (ret), "=m" (*ptr)
: "r" (new), "m" (*ptr), "a" (old)
: "memory");
return ret;

【问题讨论】:

pages.cs.wisc.edu/~remzi/OSTEP/threads-locks.pdf 在第 12 页的末尾。 @Acme 那么我们可以根据***.com/questions/3659336/… 说我们对锁(标志值)的更新较少吗?如果我错了,请纠正我!那么,我们是在谈论更少更新的强大功能吗? 它们的工作方式有根本的区别。在 CompareAndSwap 中,在获取相似值时会进行比较和更新,在 Test-and-set 中,旧值在写入新值后返回,Test -and-set 不会有最新信息,因此每次都会覆盖,而 CompareAndSwap 会,因此只有在值相同时才会写入。 【参考方案1】:

test-and-set 修改内存位置的内容并将其旧值作为单个原子操作返回。

compare-and-swap 以原子方式将内存位置的内容与给定值进行比较,并且只有当它们相同时,才会将该内存位置的内容修改为给定的新值。

【讨论】:

3为啥接受不了别人比自己优秀

为啥接受不了别人比自己优秀 查看详情

为啥 removeChild 比 innerHTML = ' ' 快?

】为啥removeChild比innerHTML=\\\'\\\'快?【英文标题】:WhyremoveChildfasterthaninnerHTML=\'\'?为什么removeChild比innerHTML=\'\'快?【发布时间】:2020-10-1904:25:29【问题描述】:我有两个函数从thisanswer到另一个问题:1.constdestroy=container=>document.... 查看详情

为啥回调比承诺更“紧密耦合”?

】为啥回调比承诺更“紧密耦合”?【英文标题】:Whyarecallbacksmore"tightlycoupled"thanpromises?为什么回调比承诺更“紧密耦合”?【发布时间】:2014-02-0404:21:15【问题描述】:你能解释一下下面这句话(取自ananswertoStackOverflow... 查看详情

为啥`[`比`subset`好?

】为啥`[`比`subset`好?【英文标题】:Whyis`[`betterthan`subset`?为什么`[`比`subset`好?【发布时间】:2012-04-0905:54:27【问题描述】:当我需要过滤一个data.frame,即提取满足特定条件的行时,我更喜欢使用subset函数:subset(airquality,Month==... 查看详情

为啥类型参数比方法参数强

】为啥类型参数比方法参数强【英文标题】:Whyisatypeparameterstrongerthenamethodparameter为什么类型参数比方法参数强【发布时间】:2020-02-1101:36:52【问题描述】:为什么public<R,FextendsFunction<T,R>>Builder<T>withX(Fgetter,RreturnValue... 查看详情

为啥字典比列表快得多?

】为啥字典比列表快得多?【英文标题】:Whyisdictionarysomuchfasterthanlist?为什么字典比列表快得多?【发布时间】:2013-06-0309:10:47【问题描述】:我正在测试从DictionaryVS列表中获取数据的速度。我用这段代码测试过:internalclassProgr... 查看详情

为啥 python gevent 比串行慢?

】为啥pythongevent比串行慢?【英文标题】:whypythongeventisslowerthanserial?为什么pythongevent比串行慢?【发布时间】:2012-02-2706:48:27【问题描述】:我正在使用gevent执行并发下载。基于this示例,代码如下:importgeventfromgeventimportmonkeyurl... 查看详情

为啥同步块比同步方法更好?

】为啥同步块比同步方法更好?【英文标题】:Whyissynchronizedblockbetterthansynchronizedmethod?为什么同步块比同步方法更好?【发布时间】:2014-01-2107:03:23【问题描述】:我已经开始学习线程同步了。同步方式:publicclassCounterprivatestati... 查看详情

为啥 blas 比 numpy 慢

】为啥blas比numpy慢【英文标题】:whyblasisslowerthannumpy为什么blas比numpy慢【发布时间】:2018-01-2505:46:09【问题描述】:感谢MatsPetersson的帮助。他的C++的运行时间终于看起来正常了!但我有两个新问题。为什么MatsPetersson的代码比我... 查看详情

为啥 Calli 比代表调用更快?

】为啥Calli比代表调用更快?【英文标题】:WhyisCalliFasterThanaDelegateCall?为什么Calli比代表调用更快?【发布时间】:2011-05-0505:22:39【问题描述】:我在玩Reflection.Emit,发现了关于很少使用的EmitCalli。很感兴趣,我想知道它是否与... 查看详情

为啥交叉应用比内连接快?

】为啥交叉应用比内连接快?【英文标题】:Whycrossapplyisfasterthaninnerjoin?为什么交叉应用比内连接快?【发布时间】:2014-03-2601:15:01【问题描述】:我有以下功能:FunctionA-returnsObjectIDandDetailIDFunctionB-returnsDetailIDandDetailName以下查... 查看详情

弱CompareAndSwap vs compareAndSwap

】弱CompareAndSwapvscompareAndSwap【英文标题】:weakCompareAndSwapvscompareAndSwap【发布时间】:2016-12-2914:46:14【问题描述】:这个问题不是关于它们之间的区别-我知道什么是虚假故障以及它为什么会发生在LL/SC上。我的问题是,如果我使... 查看详情

为啥 requestAnimationFrame 比 setInterval 或 setTimeout 更好

】为啥requestAnimationFrame比setInterval或setTimeout更好【英文标题】:WhyisrequestAnimationFramebetterthansetIntervalorsetTimeout为什么requestAnimationFrame比setInterval或setTimeout更好【发布时间】:2016-12-0704:30:15【问题描述】:为什么我应该使用requestAni... 查看详情

为啥 DataTable 比 DataReader 快

】为啥DataTable比DataReader快【英文标题】:WhyisDataTablefasterthanDataReader为什么DataTable比DataReader快【发布时间】:2012-11-1823:34:27【问题描述】:所以我们在工作中就采取哪种DataAccess路由进行了激烈的辩论:DataTable还是DataReader。免责... 查看详情

为啥“真或假”比“假或真”快? [复制]

】为啥“真或假”比“假或真”快?[复制]【英文标题】:Whyis\'TrueorFalse\'fasterthan\'FalseorTrue\'?[duplicate]为什么“真或假”比“假或真”快?[复制]【发布时间】:2015-12-0502:55:13【问题描述】:我运行了代码a=Trueb=Falsec=Falsed=Falsee=Fal... 查看详情

为啥 WebGL 比 Canvas 快?

】为啥WebGL比Canvas快?【英文标题】:WhyWebGLisfasterthanCanvas?为什么WebGL比Canvas快?【发布时间】:2015-05-0604:47:03【问题描述】:如果两者都使用硬件加速(GPU)来执行代码,为什么WebGL比Canvas更快?我的意思是,我想知道为什么在底... 查看详情

为啥提早返回比其他方法慢?

】为啥提早返回比其他方法慢?【英文标题】:Whyisearlyreturnslowerthanelse?为什么提早返回比其他方法慢?【发布时间】:2012-01-0610:53:37【问题描述】:这是ananswerIgaveafewdaysback的后续问题。编辑:似乎该问题的OP已经使用我发布给... 查看详情

为啥并行多线程代码执行比顺序慢?

】为啥并行多线程代码执行比顺序慢?【英文标题】:WhyParallelMultithreadcodeexecutionisslowerthansequential?为什么并行多线程代码执行比顺序慢?【发布时间】:2021-06-1812:59:45【问题描述】:我想使用多线程使用矩形和梯形方法执行积... 查看详情