通常当我想让线程安全的函数我锁定共享数据,然后在我完成工作时释放。
我在这里使用全局变量。简单地锁定和解锁不会确保函数返回唯一值。如何将以下函数修改为线程安全并确保它始终返回唯一的整数?
int count = 0;
int GetUnique()
{
count = count + 1;
return count;
}
有人提到在函数内部创建一个局部静态变量?如何以及为什么这样做(如果是真的)?
答案 0 :(得分:4)
在这种情况下,您希望使用原子增量,如果使用GCC内在函数则不需要锁定或互斥。 __sync_add_and_fetch
是您在这里寻找的,或者VC InterlockedIncrement
也会执行相同的操作。
您可以使用以下内容使此代码可移植:
#ifdef _WIN32
#define SYNC_ADD_AND_FETCH(x) InterlockedIncrement(&(x))
#else
#define SYNC_ADD_AND_FETCH(x) __sync_add_and_fetch(&(x), 1)
#endif
int main(int argc, char *argv[])
{
int v = 0;
SYNC_ADD_AND_FETCH(v);
printf("%d\n", v);
}
将其设置为静态不足以保护变量免受动态修改变量的其他线程的影响,实际上它无论如何都无济于事。