【发布时间】:2011-10-13 06:34:47
【问题描述】:
使用 VC++ 来获得一个向上计数的唯一 ID,我想知道这在多线程应用程序中是否合法?
uint32_t GetNewId() { return ::InterlockedIncrement(&lastId); }
基本上,我想知道 InterlockedIncrement 是否只是保护增量,或者返回值是否也防止竞争条件?
【问题讨论】:
标签: c++ multithreading increment
使用 VC++ 来获得一个向上计数的唯一 ID,我想知道这在多线程应用程序中是否合法?
uint32_t GetNewId() { return ::InterlockedIncrement(&lastId); }
基本上,我想知道 InterlockedIncrement 是否只是保护增量,或者返回值是否也防止竞争条件?
【问题讨论】:
标签: c++ multithreading increment
是的,这是合法的——访问包括
将是原子的。只是不要忘记它是 32 位的并且会溢出。
【讨论】:
函数结果在寄存器和/或堆栈中返回。每个线程都有一个单独的堆栈和寄存器集,所以,是的,这是安全的。 InterlockedIncrement 将执行它所做的事情,它的返回值与任何其他函数结果没有什么不同 - 您的函数可以被中断并从另一个线程重新输入,并且将为两者返回正确的结果。
Rgds, 马丁
【讨论】:
最好的检查方法是去source。
这个函数是原子相对于对其他联锁的调用 功能。
【讨论】: