c++11 等效于 c# Interlocked.Increment

jav*_*red 1 c++ multithreading

我正在将此 c# 代码重写为 c++:

public class LightOrder
{
    private static int internalIdCounter;

    public int InternalId { get; private set; }

    // i control myself to call this method exactly once for each order
    public void AssignInternalId(int ordersExecutorId)
    {
        // if InternalId is already assigned, i.e. != 0, i can print error or something
        InternalId = Interlocked.Increment(ref internalIdCounter);
        // more
    }

    // more
}
Run Code Online (Sandbox Code Playgroud)

这工作正常 - 即使AssignInternalId从不同的线程并行调用,每个订单也具有顺序 ID 。

与此代码最接近的 C++ 等效项是什么?我应该声明InternalIdstd::atomic<int>然后使用++吗?或者我应该声明InternalIdint并使用类似的东西std::atomic_fetch_add

Mik*_*our 5

我应该声明InternalIdstd::atomic<int>然后使用++吗?

是的。

或者我应该声明InternalIdint并使用类似的东西std::atomic_fetch_add

不。像这样的函数atomic_fetch_add只适用于原子类型( 的特化atomic,或者像 的类型atomic_int),所以你仍然需要一个原子类型。