Уникальный идентификатор с :: InterlockedIncrement (VC ++) - PullRequest
3 голосов
/ 26 июля 2011

Используя VC ++, чтобы получить уникальный идентификатор, который имеет значение вверх, мне было интересно, допустимо ли это в многопоточном приложении?

uint32_t GetNewId() { return ::InterlockedIncrement(&lastId); }

По сути, мне интересно, просто ли InterlockedIncrement защищает приращение,или возвращаемое значение также защищено от условий гонки?

Ответы [ 3 ]

4 голосов
/ 26 июля 2011

Да, это законно - доступ, который состоит из

  • прочитайте, затем
  • приращение, затем
  • напиши, потом
  • возвращает увеличенное значение вызывающей стороне

будет атомным. Только не забывайте, что он 32-битный и может переполняться.

1 голос
/ 26 июля 2011

Результаты функции возвращаются в регистрах и / или стеке. Каждый поток имеет отдельный стек и набор регистров, так что да, это безопасно. InterlockedIncrement будет делать то же, что и его возвращаемое значение, которое ничем не отличается от любого другого результата функции - ваша функция может быть прервана и повторно введена из другого потока и вернет правильный результат для обоих.

Rgds, Martin

0 голосов
/ 26 июля 2011

Лучший способ проверить это - перейти к источнику .

Эта функция атомная относительно вызовов к другим заблокированным функции.

...