Параметр InterlockedIncrement - PullRequest
       22

Параметр InterlockedIncrement

0 голосов
/ 27 ноября 2018

Я заметил, что LONG InterlockedIncrement(LONG* p) не только возвращает приращение, но также увеличивает значение по адресу самого p.Это означает, что в качестве вызывающей стороны вы можете использовать как возвращаемое значение, так и значение, на которое указывает p.

Это хорошо, на самом деле, я могу использовать это очень хорошо, но этоне упоминается в документации .

Можно ли использовать измененное значение?Будет ли это поведение изменено в будущей версии Windows API

?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Фактическое значение в ячейке памяти увеличивается, но попытка прочитать его впоследствии не будет атомарной, что-то еще могло изменить значение после возврата из функции, но до того, как вы прочитали с адреса памяти.

возвращаемое значение - это увеличенное значение в любой недавней системе, но оно не всегда работает так.Windows 95 и NT 3.x будут работать на 386 процессорах, и эти процессоры не имеют инструкции LOCK XADD.В этих системах функция LOCK INC и возвращала только знак результата .

Это, возможно, наиболее широко наблюдалось при IUnknown::Release и является частью причины, по которой его возвращаемое значениезадокументировано как «только для целей отладки».

0 голосов
/ 27 ноября 2018

Это означает, что в качестве вызывающей стороны вы можете использовать как возвращаемое значение, так и значение, на которое указывает p.

Нет, вы не можете.Возвращаемое значение содержит увеличенное значение после этого вызова InterlockedIncrement.С другой стороны, если вы читаете переменную *p, то другой поток может тем временем изменить значение.

...