c ++ 11相当于c#Interlocked.Increment

时间:2014-04-22 09:33:51

标签: 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
}

这很好 - 即使从不同的并行线程调用AssignInternalId,每个订单都有顺序ID。

与此代码相当的最接近的c ++是什么?我应该将InternalId声明为std::atomic<int>,然后使用++吗?或者我应该将InternalId声明为int并使用类似std::atomic_fetch_add的内容?

2 个答案:

答案 0 :(得分:4)

  

我应该将InternalId声明为std::atomic<int>,然后只使用++吗?

  

或者我应该将InternalId声明为int并使用类似std::atomic_fetch_add的内容?

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

答案 1 :(得分:3)

因为它正在递增一个整数,所以只使用std :: atomic就可以了:

   std::atomic<int> internalId;

   public:
      void assignInternalId()
      {
         ++internalId;
      }
      int internalId() 
      {
         return internalId.load();
      }