使用 ::InterlockedIncrement (VC++) 生成唯一标识符

3

使用VC++,获取一个递增的唯一ID,我想知道在多线程应用程序中是否合法?

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

基本上,我想知道InterlockedIncrement是否仅仅保护了递增操作,还是返回值也被防止出现竞态条件的情况?

3个回答

4

是的,这是合法的 - 访问包括以下内容:

  • 读取,然后
  • 递增,然后
  • 写入,然后
  • 将递增后的值返回给调用者

将是原子性的。只要不忘记它是32位的并且可能会溢出。


1

函数结果以寄存器和/或堆栈的形式返回。每个线程都有一个单独的堆栈和寄存器集,因此,是的,这是安全的。InterlockedIncrement将执行其操作,其返回值与任何其他函数结果没有区别 - 您的函数可以从另一个线程中断并重新进入,并为两者返回正确的结果。

敬礼, 马丁


还有一些底层解释。 - Cookie

0

检查的最佳方法是前往

该函数在调用其他交错函数时是原子的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接