2011-07-26 40 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