Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 联锁增量参数_C++_Windows_Winapi_Atomic - Fatal编程技术网

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解决这个问题。