直接返回InterlockedDecrementRelease()结果与先存入变量再返回是否存在差异?
InterlockedDecrementRelease()结果与先存入变量再返回是否存在差异?
嘿,这个问题问到点子上了!尤其是涉及到多线程和内存栅栏的时候,很容易让人担心临时变量会不会搞出什么意外,我来给你掰扯清楚:
从内存语义、原子性以及最终生成的机器码来看,这两种写法完全没有差异,本质上是等价的。
先给你拆解下核心原因:
InterlockedDecrementRelease本身是一个原子操作,它的返回值就是递减完成后_count的最终值,而且Release语义的内存栅栏在函数执行过程中就已经生效了——不管你是直接返回这个结果,还是先把它存到临时变量ret再返回,都不会改变这个操作的原子性和内存栅栏语义。- 对于现代编译器(比如你用到的Windows x86平台的MSVC),只要开启了优化选项,这两段代码会被编译成完全相同的机器码:临时变量
ret会被直接优化掉,不会产生任何额外的指令,自然也不会对多线程场景造成任何影响。
那这个临时变量到底是干嘛的?其实纯粹是编码风格问题:
- 有些人习惯把函数返回值先存到变量里,方便调试——比如调试时可以给这个变量加断点,直接查看返回的具体数值;
- 还有些人是为了代码可读性,觉得显式用变量承接返回值,逻辑会更清晰(尤其是当函数逻辑更复杂的时候),但在这个极简的场景下,完全就是个人习惯罢了。
总结一下:不用纠结,两种写法在多线程场景下是安全等价的,临时变量不会带来任何特殊的内存语义影响,只是风格差异而已。
备注:内容来源于stack exchange,提问作者Jiří Lechner
相关产品推荐
相关产品推荐

