C++ 联锁增量参数
我注意到C++ 联锁增量参数,c++,windows,winapi,atomic,C++,Windows,Winapi,Atomic,我注意到LONG InterlockedIncrement(LONG*p)不仅返回增量,而且还增加p本身地址处的值。这意味着,作为调用者,您既可以使用返回值,也可以使用p所指向的值 这很好,事实上,我可以很好地使用它,但在文章中没有提到 可以使用修改后的值吗?这种行为是否可以在未来版本的Windows API中更改 这意味着,作为调用者,您既可以使用返回值,也可以使用p所指向的值 不,你不能。返回值包含调用InterlocatedIncrement后的增量值。另一方面,如果您读取变量*p,则另一
LONG InterlockedIncrement(LONG*p)
不仅返回增量,而且还增加p
本身地址处的值。这意味着,作为调用者,您既可以使用返回值,也可以使用p
所指向的值
这很好,事实上,我可以很好地使用它,但在文章中没有提到
可以使用修改后的值吗?这种行为是否可以在未来版本的Windows API中更改
这意味着,作为调用者,您既可以使用返回值,也可以使用p
所指向的值
不,你不能。返回值包含调用
InterlocatedIncrement
后的增量值。另一方面,如果您读取变量*p
,则另一个线程可能同时修改了该值。内存位置中的实际值会增加,但之后尝试读取它不会是原子的,在函数返回后但在从内存地址读取之前,可能有其他内容修改了该值
返回值是最近任何系统上递增的值,但它并不总是这样工作。Windows 95&NT 3.x将在386个处理器上运行,这些处理器没有LOCK XADD
指令。在这些系统上,功能没有锁定INC和
这可能是在
IUnknown::Release
中观察到的最著名的情况,也是其返回值被记录为“仅用于调试目的”的部分原因。这是不可能的,它不长**。非常声明需要非常的证据,你没有提供任何证据。@HansPassant我没有声明任何东西,我只是想理解我看到的东西。如果你是说p
所指的值是递增的,那么InterlockedIncrement
就是这样做的。然后返回该值,如文档所述:InterlockedIncrement返回递增的值。您可能无法直接读取p
所指向的值,因为这将是一个竞争条件,此函数首先要解决这个问题。@Ben,但这并不奇怪,因为这正是InterlocatedIncrement
应该做的:增加参数指向的值!?另外,请注意@rustyx的注释“这意味着,作为调用者,您可以使用返回值以及p
指向的值”-不,您不能。还提到了这一点:“InterlockedIncrement
仅对于其他InterlockedXxx
调用是原子的。”通过指针访问值将引入一个数据竞争,您试图使用InterlockedXxx
API解决这个问题。