功能本地静态变量用于唯一ID生成

时间:2010-11-21 13:01:51

标签: c++ c thread-safety

  

可能重复:
  ID generator with local static variable - thread-safe?

以下函数每次调用时都会返回一个唯一的数字吗?在多线程场景中怎么样?

int returnUniqueNumber()
{
  static int i = 0;
  ++i;
  return i;
}

3 个答案:

答案 0 :(得分:5)

这取决于您的平台,以及您是否会遇到多线程问题。在Windows上,你最好做以下事情:

int returnUniqueNumber()
{
  volatile static long l = 0;
  return (int)InterlockedIncrement( &l );
}

Interlocked*函数保证原子。

答案 1 :(得分:3)

如果您的应用程序是单线程的,那么您发布的代码实际上是正确的,符合标准的C / C ++生成唯一编号的方式。但是,由于您正在寻找一种线程安全的解决方案,因此您必须深入研究特定于平台的解决方案。 Goz有一个很好的Windows解决方案。在Mac OS X或iOS上的等价物是:

int returnUniqueNumber_APPLE(void) {
    static volatile int32_t i = 0;
    return (int)OSAtomicIncrement32Barrier(&i);
}

在使用最近的GCC编译的任何系统上,你也有GCC的内在函数:

int returnUniqueNumber_GCC(void) {
    static volatile int i = 0;
    return __sync_add_and_fetch(&i, 1);
}

答案 2 :(得分:1)

关于Goz关于Windows的答案,对于Linux / GCC,请看这个问题/答案:

Equivalent of InterlockedIncrement in Linux/gcc

在这种情况下,您需要__sync_add_and_fetch()