我将这个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
的内容?
答案 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();
}