Я отлаживаю некоторый код с помощью библиотеки C ++ boost, которая использует Windows InterlockedDecrement
а также InterlockedIncrement
,
В выведенной сборке InterlockedIncrement использует LOCK INC
тогда как InterlockedDecrement использует LOCK XADD
,
Почему они оба не используют LOCK XADD
?
(Это на Win 7 64, 64-битной компиляции и MSVC 11)
INC
Инструкция имеет более короткую кодировку. Вы можете реализовать оба с LOCK XADD
, но код занял бы больше места в памяти. Они, вероятно, идентичны, как только они превращаются в мопс.
Теперь, почему бы не использовать LOCK DEC
?
Я предполагаю, что рассматриваемый код выглядит примерно так:
InterlockedIncrement(&refcount);
...
if (InterlockedDecrement(&refcount) == 0)
...
Это общая схема подсчета ссылок. В такой ситуации вы не можете использовать LOCK DEC
так как LOCK DEC
не возвращает результирующее значение.
// WRONG WRONG WRONG WRONG
InterlockedDecrement(&refcount);
// <-- another thread might modify refcount here
if (refcount == 0)
...