C# 结合联锁.增量和联锁.交换

C# 结合联锁.增量和联锁.交换,c#,.net,multithreading,C#,.net,Multithreading,我希望以原子方式递增静态变量,同时以无锁方式将新值分配给实例字段。目标是让每个对象在创建时获得唯一的递增id,这样两个对象就没有机会获得相同的id 下面的代码可以实现这一点吗 class MyClass { private static int currentOrderingId; private int orderingId; public MyClass() { Interlocked.Exchange(ref orderingId, Int

我希望以原子方式递增静态变量,同时以无锁方式将新值分配给实例字段。目标是让每个对象在创建时获得唯一的递增id,这样两个对象就没有机会获得相同的id

下面的代码可以实现这一点吗

class MyClass
{
    private static int currentOrderingId;
    private int orderingId;

    public MyClass()
    {
        Interlocked.Exchange(ref orderingId, Interlocked.Increment(ref currentOrderingId));
    }
}

您只需执行以下操作:

orderingId = Interlocked.Increment(ref currentOrderingId);

两个线程无法接收相同的值,因此它是线程安全的。

您只需要
orderingId=Interlocked.Increment(ref currentOrderingId)@Matthew Watson:当然,为什么我没想到呢(请在回答中发布此消息。@Tudor写入的原子性是不相关的,因为这是构造函数-因此该字段还不能对多个线程可见(除非在分配字段之前在构造函数中传递
引用等错误操作)@xanatos事实上,对于构造函数,在将对构造对象的引用分配给接收它的变量之前,可以保证构造函数已经运行到完成,因此任何其他线程都不可能观察到字段的未初始化值。有关更多详细信息,请参阅。我删除了我的注释…但后来我删除了一些研究…CLR20模型还没有在中实现,它仍然使用ECMA弱模型…而Unity使用Mono…@xanatos啊,很好!因此在Unity中,必须小心从线程而不是创建线程访问刚刚创建的对象。