2011-07-26 39 views
3

使用VC++,以獲得一個唯一的ID向上計數,我不知道這是否是合法的在多線程應用程序?唯一ID與:: InterlockedIncrement(VC++)

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

基本上,我想知道是否InterlockedIncrement只是保護增量,還是返回值也是防範的競爭條件?

回答

4

是的,這是合法的 - 它由

  • 讀的訪問,然後
  • 增量,然後
  • 寫,然後
  • 回報遞增的值給調用者

將是原子的。只要不要忘記,它是32位,可以溢出。

+0

感謝您的再次確認。 – Cookie

0

檢查的最佳方法是轉到source

此功能原子相對於調用其它互鎖 功能。

1

函數結果以寄存器和/或堆棧形式返回。每個線程都有獨立的堆棧和寄存器集,所以,這是安全的。 InterlockedIncrement將做它做的事情,它的返回值與其他任何函數結果沒有什麼不同 - 你的函數可以被中斷並從另一個線程重新進入,並且會返回兩者的正確結果。

Rgds, Martin

+0

併爲一些引擎蓋下的解釋。 – Cookie