【问题标题】:Unique ID with ::InterlockedIncrement (VC++)带 ::InterlockedIncrement 的唯一 ID (VC++)
【发布时间】:2011-10-13 06:34:47
【问题描述】:

使用 VC++ 来获得一个向上计数的唯一 ID,我想知道这在多线程应用程序中是否合法?

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

基本上,我想知道 InterlockedIncrement 是否只是保护增量,或者返回值是否也防止竞争条件?

【问题讨论】:

    标签: c++ multithreading increment


    【解决方案1】:

    是的,这是合法的——访问包括

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

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

    【讨论】:

      【解决方案2】:

      函数结果在寄存器和/或堆栈中返回。每个线程都有一个单独的堆栈和寄存器集,所以,是的,这是安全的。 InterlockedIncrement 将执行它所做的事情,它的返回值与任何其他函数结果没有什么不同 - 您的函数可以被中断并从另一个线程重新输入,并且将为两者返回正确的结果。

      Rgds, 马丁

      【讨论】:

      • 还有一些幕后解释。
      【解决方案3】:

      最好的检查方法是去source

      这个函数是原子相对于对其他联锁的调用 功能。

      【讨论】:

        猜你喜欢
        • 2011-12-13
        • 1970-01-01
        • 1970-01-01
        • 2011-08-27
        • 2010-11-24
        • 1970-01-01
        • 2020-09-23
        • 1970-01-01
        • 2011-02-20
        相关资源
        最近更新 更多