InterlockedIncrement 参数
InterlockedIncrement parameter
我注意到 LONG InterlockedIncrement(LONG* p)
不仅 return 增加了,而且还增加了 p
本身地址处的值。这意味着,作为调用者,您可以使用 return 值,以及 p
.
指向的值
这个很好,其实我也可以很好用,只是documentation里面没有提到。
可以使用修改后的值吗?这种行为是否可以在 Windows API
的未来版本中改变?
Which means, that as caller, you can use both the return-value, as well as the value pointed to by p
.
不,你不能。 return 值包含调用 InterlockedIncrement
后增加的值。另一方面,如果您读取变量 *p
,那么另一个线程可能同时修改了该值。
内存位置中的实际值会增加,但之后尝试读取它不会是原子的,其他东西可能在函数 returns 之后但在您从内存地址读取之前修改了值。
return 值是任何最新系统上的增量值,但它并不总是这样工作。 Windows 95 & NT 3.x 将在 386 处理器上 运行 而这些处理器没有 LOCK XADD
指令。在那些系统上,函数执行 LOCK INC
和 only returned the sign of the result.
这可能是 IUnknown::Release
最著名的观察结果,也是其 return 值被记录为 "for debugging purposes only".
的部分原因
我注意到 LONG InterlockedIncrement(LONG* p)
不仅 return 增加了,而且还增加了 p
本身地址处的值。这意味着,作为调用者,您可以使用 return 值,以及 p
.
这个很好,其实我也可以很好用,只是documentation里面没有提到。
可以使用修改后的值吗?这种行为是否可以在 Windows API
的未来版本中改变?Which means, that as caller, you can use both the return-value, as well as the value pointed to by
p
.
不,你不能。 return 值包含调用 InterlockedIncrement
后增加的值。另一方面,如果您读取变量 *p
,那么另一个线程可能同时修改了该值。
内存位置中的实际值会增加,但之后尝试读取它不会是原子的,其他东西可能在函数 returns 之后但在您从内存地址读取之前修改了值。
return 值是任何最新系统上的增量值,但它并不总是这样工作。 Windows 95 & NT 3.x 将在 386 处理器上 运行 而这些处理器没有 LOCK XADD
指令。在那些系统上,函数执行 LOCK INC
和 only returned the sign of the result.
这可能是 IUnknown::Release
最著名的观察结果,也是其 return 值被记录为 "for debugging purposes only".