InterlockedDecrement использует XADD, но InterlockedIncrement использует INC?

Я отлаживаю некоторый код с помощью библиотеки C ++ boost, которая использует Windows InterlockedDecrement а также InterlockedIncrement,

В выведенной сборке InterlockedIncrement использует LOCK INC тогда как InterlockedDecrement использует LOCK XADD,

Почему они оба не используют LOCK XADD?

(Это на Win 7 64, 64-битной компиляции и MSVC 11)

2

Решение

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)
...
4

Другие решения


По вопросам рекламы [email protected]