可能重复:
ID generator with local static variable - thread-safe?
以下函数每次调用时都会返回一个唯一的数字吗?在多线程场景中怎么样?
int returnUniqueNumber()
{
static int i = 0;
++i;
return i;
}
答案 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()